【问题标题】:Mysterious "remove" key inserted in my object when populating it填充对象时插入我的对象的神秘“删除”键
【发布时间】:2016-02-26 17:46:20
【问题描述】:

我正在迭代一个数组(结果)并填充一个对象(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”。像“remove”这样的 value.Id 不存在永远不会从 $.each 中打印出来。

【问题讨论】:

  • 你可能有另一个库向 Array.prototype 添加删除方法

标签: javascript arrays object key


【解决方案1】:

好的,如果它是一个对象,而不是一个数组(你的代码将它命名为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 对象的其他属性。

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

【讨论】:

  • 我怀疑发生了类似你提到的事情。但是,由于 testArray 是一个对象,我不能在其上使用 .length 。我试过了。您的其他建议 .forEach 也不起作用。我不知道该怎么办。
  • @Arthlete - 你没有说它是一个普通的对象,你的代码称之为testArray,所以我们都认为它是一个数组。如果它不是数组,那是一个糟糕的变量名。看看我在答案开头添加了什么。
  • 你是对的。我写代码的时候很着急。是我的错。感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 2021-07-20
  • 1970-01-01
  • 2013-01-11
  • 2020-02-23
  • 2020-02-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多