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 -