最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

How could I iterate on object's attributes backwards in javascript? - Stack Overflow

programmeradmin2浏览0评论

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?

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?

Share Improve this question edited Jul 11, 2013 at 19:00 diwatu asked Jul 11, 2013 at 18:05 diwatudiwatu 5,6995 gold badges40 silver badges63 bronze badges 3
  • Enumerating objects doesn't guarantee a specific order... You can use an array if you need to keep them in a specific order. – brbcoding Commented Jul 11, 2013 at 18:08
  • There is also one discussion / post. – Niklas Commented Jul 11, 2013 at 18:09
  • Also something to look at: stackoverflow./questions/1159277/array-flip-in-javascript – DevlshOne Commented Jul 11, 2013 at 18:09
Add a ment  | 

2 Answers 2

Reset to default 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 parator 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.

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.

发布评论

评论列表(0)

  1. 暂无评论