填充时在我的对象中插入了神秘的 "remove" 键

Mysterious "remove" key inserted in my object when populating it

我正在迭代一个数组(结果)并填充一个对象(testArray)。这是我的代码:

$.each(results, function(key, value)
{
        console.log('value is');
        console.log(value.Id);
        testArray[value.Id] = value;
});
for(var key in testArray) {
            console.log(key);
            console.log(testArray[key].Name);
        }

问题: 在遍历 testArray 时,最后打印的键是 "remove",与之关联的名称是 "undefined"。这样的 value.Id 作为 "remove" 不存在永远不会从 $.each.

打印出来

好的,如果它是一个对象,而不是一个数组(你的代码将它命名为 testArray 这真的很混乱),那么你可以这样做来消除已经添加到原型中的可枚举属性:

for (var key in testArray) {
    if (testArray.hasOwnProperty(key)) {
        console.log(testArray[key]);
    }
}

之前的回答,虽然我们都认为 testArray 是一个数组。

这就是为什么你不应该用以下方式迭代数组的原因:

for (var key in testArray)

因为它迭代了数组对象的所有可枚举属性,而不仅仅是数组元素。您可能 运行 一些代码添加了一个新方法来执行您的 for/in 迭代所拾取的数组对象。

改为使用传统的 for 循环或使用 .forEach().

for (var i = 0; i < testArray.length; i++) {
    console.log(testArray[i]);
}

testArray.forEach(function(item) {
    console.log(item);
});

这些方法将仅枚举实际的数组元素,而不枚举可能已添加到 Array 对象的其他属性。

P.S。如果将方法设置为不可枚举,则可以将方法添加到数组中而不会遇到此问题,但您仍然不应该使用 for/in 迭代数组。此外,ES6 有一个新的 for/of 语法,可以安全地用于迭代数组,但它需要 ES6 环境。