4

例如,我已经有一个填充了有序键值的对象,我可以使用for in语句向前迭代它的键:

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

现在我想像'key3', 'key2', 'key1'那样向后迭代键,有没有一种神奇的方法可以做到这一点?

4

2 回答 2

9

for... in不能保证循环中的顺序。

等等,什么?

对象键的“顺序”没有逻辑。如果你愿意,你可以抓住它们,然后.sort在它们身上使用。语言规范for...in迭代算法中明确告诉我们这一点:

未指定枚举属性的机制和顺序(第一个算法中的步骤 6.a,第二个算法中的步骤 7.a)。

你有什么选择:

在 JavaScript 中,大多数时候有序列表由数组表示。如果您喜欢有序列表,您可以使用数组:

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

由于保证了顺序,您还可以轻松地反转它:

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.
}

如果您已经一个对象.sort,您可以根据某些标准获取它的键和 它们,例如 - 按字典顺序:

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

注意:您可以将比较器传递给.sort并让它为您反转它而不是链接 - 这可能是更好的做法。出于教学目的,我保持这种方式。

于 2013-07-11T18:07:01.523 回答
2

您可以使用var keys = Objects.keys(keyvalues).sort()来获取对象的所有键,然后在循环中遍历它的 backwordsfor(int = keys.length;i>0;i--)访问原始对象,就像value = object[keys[i]]在循环中一样

编辑:将函数调用添加sort到返回的键数组中Object.keys

于 2013-07-11T18:09:44.273 回答