我有一个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' ]
如何使用动态属性覆盖旧值?
答案 0 :(得分:4)
对象属性正如您期望的那样工作。问题是你没有清除arr
数组;所以你只是在它上面堆积相同的属性。尝试将arr = [];
放在第二个for循环之前,你应该是金色的。
您可以使用哈希等对象;相反,如果你有这个:
var hash = {};
for( var prop in foo ) { hash[prop] = foo[prop]; }
即使您重复使用hash
变量,您也会获得所需的行为。数组不是对象。
答案 1 :(得分:1)
你从未在第一次循环后清除数组。所以你将'bar'和'baz'添加到数组中,然后将'bam'添加到foo,再次循环foo并获得'bar','baz'(从第一次迭代),然后'bar','baz'和'bam'(来自第二次迭代)