4

For example I already have an object filled with ordered key-values, I can iterate its keys forwards with for in statement:

var keyvalues = {"key1":"value1","key2":"value2","key3":"value3"};
for(var key in keyvalues)
{
   var value = keyvalues[key];
   .............
}

Now I want to iterate the keys backwards like 'key3', 'key2', 'key1', is there a magic way to do this?

3

2 Answers 2

9

There is no guarantee of order in a for... in loop.

Wait, what?

There is no logic in 'order' of object keys. If you'd like, you can grab them and then use .sort on them. The language specification tells us this explicitly in the for...in iteration algorithm:

The mechanics and order of enumerating the properties (step 6.a in the first algorithm, step 7.a in the second) is not specified.

What are your options:

In JavaScript, most of the time ordered lists are represented by arrays. You can us an array if like an ordered list in your case:

var values= ["key1","key2","key3"];
for(var i=0;i<values.length;i++){
   values[i];// order is guaranteed here.
}

Since order is guaranteed you can also easily reverse it:

var values= ["key1","key2","key3"].reverse();//reverse is an array method
for(var i=0;i<values.length;i++){
   values[i];// order is guaranteed here.
}

If you already have an object you can grab its keys and .sort them based on some criterion, for example - in a lexicographical order :

var obj = {"key1":"value1","key2":"value2","key3":"value3"};
var keys = Object.keys(obj).sort().reverse(); // see note
for(var i=0;i<keys.length;i++){
    console.log(keys[i]);
}
// will output key3, key2, key1

note: you can pass a comparator to .sort and have it reverse it for you instead of chaining - which is probably better practice. I kept it this way for pedagogical purposes.

Sign up to request clarification or add additional context in comments.

1 Comment

I believe that is no longer the case. for...in now always iterates over integer keys between 0 and 2^32-1 first in order of low to high, then over the rest of the keys in the same order that they were added to the object.
2

You could use var keys = Objects.keys(keyvalues).sort() to get all the keys of the object then just iterate through it backwords in a for(int = keys.length;i>0;i--) loop accessing the original object like so value = object[keys[i]] in the loop

EDIT: Added the sort function call to the array of keys returned by Object.keys.

3 Comments

The order returned by Object.keys is not guaranteed.
How would you iterate backwards through an object that has dynamically changing keys then?
@Legion You can sort them - see my answer. The fact the keys iterated in the order key1,key2,key3 is completely coincidental - it's implementation detail and may change any day.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.