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 -

Reply via email to