当使用对象数组时,forEach不起作用但for循环可以。

16

我有一个类似这样的数组

var updates = [];

然后我像这样向数组中添加内容

updates["func1"] = function () { x += 5 };
当我使用 for 循环调用函数时,它按预期工作。
for(var update in updates) {
     updates[update]();
}

但是当我使用forEach时,它不起作用!?

updates.forEach(function (update) {

    update();
});

我在使用Google Chrome浏览器时,forEach函数肯定可以工作,那我做错了什么?

2个回答

26

forEach循环遍历的是indexes而不是properties。你的代码:

updates["func1"] = "something";

将属性添加到一个对象中——恰好是一个数组——而不是向数组中添加元素。 实际上,这相当于:
updates.func1 = "something";

如果您需要类似于哈希映射的东西,可以使用普通对象代替:
updates = {};

updates["func1"] = "something";

然后使用for...in进行迭代,但不应该用于数组

或者您可以使用Object.keys来检索属性并对其进行迭代:

Object.keys(updates).forEach(function(key) {
    console.log(key);
}); 

谢谢,这帮助我更好地理解了它,我读到不应该使用 for...in,这就是为什么我问这个问题的原因,所以感谢提供 for...in 的替代方案 :) - GriffLab

6

您并没有将项目添加到数组中,而是将对象属性添加到数组对象中。 for .. in 将返回所有属性,forEach 仅迭代数组元素。

要添加到数组中,您需要执行以下操作:

updates.push(function () { x += 5 });

如果您只想添加一个对象,而不是数组,请使用对象:
var updates = {}

然后使用 for ... in


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接