0

我有一个在循环中动态构建的 javascript 对象。我想在迭代期间用较新的属性替换可能已经存在的属性 - 基本上将对象视为 Java HashSet。

为什么当您向 javascript 对象添加动态属性,然后使用 for in 循环遍历该对象时,您会获得该属性的多个值或其他奇怪的行为?

例子:

var foo = {};

foo['bar'] = 'hello';

foo['bar'] = 'hola';

foo['bar'] = 'aloha';

foo['baz'] = 'some other thing';

var arr = [];

for(var prop in foo) { arr.push(foo[prop]) };
//2 entries (what I'd expect)

foo['bam'] = 'other other thing';

for(var prop in foo) { arr.push(foo[prop]) };
//5 entries (why?) the [bar] property should be overwritten right?

console.log(arr);
[ 'aloha',
  'some other thing',
  'aloha',
  'some other thing',
  'other other thing' ]

如何使用动态属性用新值覆盖旧值?

4

2 回答 2

4

对象属性按照您期望的方式工作。问题是您没有清除arr数组;所以你只是在上面堆放相同的属性。尝试arr = [];在你的第二个 for 循环之前放置,你应该是金色的。

可以使用像哈希这样的对象;相反,如果你有这个:

var hash = {};
for( var prop in foo ) { hash[prop] = foo[prop]; }

即使您重新使用该hash变量,您也会得到您想要的行为。数组不像对象。

于 2013-07-02T03:44:22.497 回答
1

在第一个循环之后,您从未清除过数组。所以你将'bar'和'baz'添加到数组中,然后将'bam'添加到foo,再次循环通过foo并获得'bar','baz'(从第一次迭代),然后是'bar','baz' , 和 'bam' (来自第二次迭代)

于 2013-07-02T03:46:55.657 回答