为什么不't此代码循环遍历对象的所有属性

Why doesn't this code loop through all properties of an object?

本文关键字:对象 遍历 属性 循环 代码 为什么不      更新时间:2023-09-26

这里有一个小代码片段:

cards = [ 4, 10, 3, 12, 10, 13, 12  ];
suits = [ 1, 64, 8, 8, 1, 1, 32 ];
var o = {}, keyCount = 0, j;
for (i = 0; i < cards.length; i++) {
    e = cards[i] + suits[i];
    o[e] = 1
}
for (j in o) {
    if (o.hasOwnProperty(j)) {
        keyCount++;
    }
}

经过一些调试,我发现当我迭代"o"对象(第二个循环)中的所有属性时,循环只执行6次,而不是7次。

尽管在第一个循环中向"o"对象添加了7个属性,但情况依然如此。

为什么会这样?我在第一个循环中添加了7个属性,那么为什么第二个循环只执行6次呢?

原因并不是像Pointy在评论中所说的那样,数字12在卡片数组中出现了两次。他说两处房产不可能具有相同的价值,这让我明白了这一点。我说的是e = cards[i] + suits[i];,碰巧有时这两个值加在一起有时会得到相同的答案。例如,在本例中3+8=11,10+1也=11

Javascript对象不能有重复的键&上面的片段违反了这一点,这是因为3+8&10+1都等于11。在这种情况下,它将占据最新的价值。所以钥匙必须是独一无二的。因此,更改整数以产生不同的和值。

cards = [ 4, 10, 3, 12, 11, 13, 12 ];
suits = [ 1, 64, 8, 8, 1, 1, 32 ];

工作副本

正如大多数人所注意到的,您的对象中存在重复项。如果您想处理当前的输入数据,请尝试将数字连接为字符串,而不是将它们相加——这将为您提供一组更大的可能值。类似的东西

e = cards[i]+":"+suits[i];

所以在你的物体中会有"4:1","10:64"形式的键。这很好,因为如果以后需要,您还可以将它们拆分以再次获得初始值。