【问题标题】:Prototype object when looping through array?遍历数组时的原型对象?
【发布时间】:2023-03-25 22:52:01
【问题描述】:

我在遍历数组时得到了令人困惑的结果。

填充数组的样子

var tables = [];
// ...
// t is table as jQuery object
tables[t.attr('id')] = t;

稍后,当循环遍历表格数组时,我得到的元素比实际添加的元素多一个。当另一个对象到达 t.removeClass() 时程序中断

for (t in tables) {
    var t = tables[t];
    t.removeClass(...);
}

Visual Studio Debugger 将另一个对象描述为“克隆”,这是原型对象/属性(?)的第一个方法。

tables
    [prototype]
        [Methods]
            clone
            ...
        [prototype]
    MyTable0
    MyTable1

我读到每个 javascript 对象都带有一个原型属性,但是为什么这里的原型被视为一个对象呢?

【问题讨论】:

  • 你能显示填充数组的代码吗?

标签: javascript jquery arrays prototype


【解决方案1】:

注意:如果您的 id 不是数字,那么您不需要数组,请查看其他答案。

要遍历数组,请勿使用 for..in 构造。

使用

for (var i=0; i<tables.length; i++) {
    var t = tables[i];
    t.removeClass(...);
}

或者如果你不喜欢 IE8:

tables.forEach(function(t) {
    t.removeClass(...);
});

或使用 jQuery :

$.each(tables, function(_,t){
    t.removeClass(...);
});

旁注:看起来有人糟糕地丰富了原生 Array 类的原型。这是generally seen as bad practice。这样做使属性可枚举更糟糕。您应该考虑删除或修复您使用的库。

【讨论】:

  • tables.length 为 0,因为它是一个关联数组。 tables.forEach 也不起作用。
  • @user2558051 那么你根本不应该使用数组。请参阅 Eggward 的回答。
【解决方案2】:

您对表格的声明应该是:

var tables = {};

【讨论】:

  • 看起来 OP 确实应该使用对象作为映射而不是数组。如果你稍微解释一下,你就会得到我的 +1。
  • 因为您想要做的是将 t.attr('id') 关联到您的 t 对象。数组的行为不是这样。
猜你喜欢
  • 2017-09-19
  • 1970-01-01
  • 2021-11-14
  • 2020-12-15
相关资源
最近更新 更多