如何访问for..in循环的计数器?
我有一个数组和一个对象。我想迭代对象属性,同时对数组做同样的事情,而不是明确地声明一个计数器。
var colors = ['red','yellow','purple','blue'];
var flowers = {'rose':'','sunflower':'','violet':'','hydrangea':''};
for (prop in flowers) {
flowers[prop] = colors[i];
}
跟进问题。如果不可能,我将如何使用我需要的功能创建自己的for循环。以下是它目前的工作方式,但我发现我经常这样做,并希望创造可重复使用的东西。
var colors = ['red','yellow','purple','blue'];
var flowers = {'rose':'','sunflower':'','violet':'','hydrangea':''};
var i = 0;
for (prop in flowers) {
flowers[prop] = colors[i];
i++;
}
答案 0 :(得分:4)
(ECMAScript 2015更改内容,请参阅答案末尾的更新。)
我有一个数组和一个对象。我想迭代对象属性,同时对数组做同样的事情,而不是明确地声明一个计数器。
我不相信你可以。此外,了解对象中的属性没有顺序非常重要。你似乎假设你会得到“玫瑰”,然后是“向日葵”等。这根本就不能保证。许多引擎按属性添加到对象的顺序访问对象属性名称,对象初始化程序中的文字属性添加到对象的顺序现在是(从ES5开始,一对夫妇)指定的,但是在for-in
中以任何特定顺序访问它们都没有指定行为(类似地,Object.keys
没有以任何特定方式排序),并且完全正确的引擎可以在任何特定方式访问它们订购它。
因此,仅使用您显示的数组和对象,就没有可靠的方法将这些属性映射到数组条目。
从ECMAScript 2015(ES6)开始,对象属性have order now:
- 让键成为新的空列表。
- 对于作为整数索引的 O 的每个自有属性键 P ,按升序数字索引顺序
- 添加 P 作为键的最后一个元素。
- 对于 O 的每个属性键 P ,它是一个String但不是整数索引,在属性创建顺序中
- 添加 P 作为键的最后一个元素。
- 对于作为符号的 O 的每个属性键 P ,在属性创建顺序中
- 添加 P 作为键的最后一个元素。
- 返回键。
醇>
好的,我们知道它们将以“创建”顺序访问,但它们是以对象初始化程序创建的顺序?好消息:Object initializers在源代码顺序中处理,因此这是确定性的。您的rose
来自sunflower
等
这意味着虽然在没有明确声明和维护索引变量的情况下仍然无法执行您想要的操作,但可以可靠地关联该数组和该对象:
// Works as of ES6
var colors = ['red','yellow','purple','blue'];
var flowers = {'rose':'','sunflower':'','violet':'','hydrangea':''};
let i = 0;
for (prop in flowers) {
flowers[prop] = colors[i++];
}
我不是建议这样做,但现在可以在合规引擎上使用。