And indeed, I tested this in FF, worked well... then (surprisingly?) tested it in IE, and it worked oddly.
this was the code: var o = { b:1, c:2, d:3 }; delete o.b; o.e = 4; o.b = 2; o.a = 5; for(i in o)alert(i); IE would put o.b back into it's place (1st).. so yes, if the order is relevant, this ain't good enough. Ariel Flesler On 11 oct, 20:18, Pops <[EMAIL PROTECTED]> wrote: > Thanks Danny. > > If associated arrays in javascript is using memory map in the RTE, > e.g., C/C++ string list map, then the key is a hash and there is no > order to it. Traversal is unpredictable and FIFO (queues), LIFO > (stacks) does not apply here. > > -- > HLS > > On Oct 11, 6:58 pm, [EMAIL PROTECTED] wrote: > > > > > I would be very wary of assuming that the for loop goes Last In First > > Out. To quote the Mozilla docs (http://developer.mozilla.org/en/docs/ > > Core_JavaScript_1.5_Reference:Statements:for...in): > > A for...in loop iterates over the properties of an object in an > > arbitrary order. > > > It may work correctly in the browsers you tested, but could break at > > any time. > > > Danny Wachsstock > > > On Oct 11, 3:30 pm, Flesler <[EMAIL PROTECTED]> wrote: > > > > The for iteration goes from the older ones to newer ones, so if you > > > want to keep newer ones (FIFO): > > > function pruneCache(amt) { > > > for (var i in cache) { > > > if (cache.length <= amt) return;//pruned > > > delete cache[i]; > > > cache.length--; > > > }} > > > > that asumes you are keeping the length updated till here. If you want > > > to remove newer first(LIFO): > > > function pruneCache(amt) { > > > delete cache.length;//remove length to avoid iterating it > > > var copy = {length:0}; //new hash > > > for (var i in cache) { > > > if (copy.length >= amt) break;//done > > > copy[i] = cache[i]; > > > copy.length++; > > > } > > > cache = copy;//replace the old cache > > > > } > > > > The other option is to have 2 parallel arrays of keys and values... > > > Hope that helps. > > > > Ariel Flesler > > > > On Oct 11, 4:54 pm, Pops <[EMAIL PROTECTED]> wrote: > > > > > Thanks Mike and Wizzud. > > > > > Question: > > > > > What I wanted to use this for was my cache and to "truncate" old > > > > data. I see that using a real array will allow me to use the > > > > inherited .length property to set a new size and it will do > > > > truncation. But since I am using an associated array, the length > > > > property is no longer usable. > > > > > So if I use the for loop with delete, will I be pulling the "rug from > > > > under its feet?" > > > > > Typically, in code designs like this, you would do a reverse traversal > > > > to delete the last entries first so you can keep with the internal > > > > loop counters and/or references. > > > > > In other words, is this "safe?" > > > > > function pruneCache(amt) { > > > > var n = 0; > > > > for (var i in cache) { > > > > if (amt > 0) { > > > > amt--; > > > > delete cache[i]; > > > > return; > > > > } > > > > n++; > > > > } > > > > cache.length = n; > > > > } > > > > > If not, then in lieu of a reverse loop syntax, I would probably need > > > > to copy the cache first? I have not checked but if returning false > > > > stops the traveral that would be more efficient. > > > > > I could recode all this into a pure indexed array and then use > > > > the .length, but then I would need a fast lookup method or 2nd matrix > > > > to map the associated name with the array index. > > > > > Thanks > > > > > -- > > > > HLS > > > > > On Oct 11, 4:26 am, "Michael Geary" <[EMAIL PROTECTED]> wrote: > > > > > > > From: Pops > > > > > > > Is this the only way to iterate through an object? > > > > > > > for ( x in myObject) { > > > > > > } > > > > > > Ultimately, yes. You can use something like $.each() on an object, > > > > > but it > > > > > just runs that same for loop internally - see the source code for > > > > > $.each(). > > > > > > > and how can you remove an field in an object? > > > > > > > For example: > > > > > > > var obj = { > > > > > > x1: 1123, > > > > > > x2: 212, > > > > > > x3: 123131 > > > > > > }; > > > > > > > I want to remove obj.x2 the obj object to end up with: > > > > > > > { x1: 1123, x3: 123131} > > > > > > delete obj.x2; > > > > > > or > > > > > > delete obj['x2']; > > > > > > Note that it is not an error if the property doesn't exist, so you > > > > > don't > > > > > have to "protect" the delete with code like this: > > > > > > if( 'x2' in obj ) delete obj.x2; // unnecessary precaution > > > > > > -Mike- Hide quoted text - > > > > > - Show quoted text -- Ocultar texto de la cita - > > - Mostrar texto de la cita -