单个Javascript对象属性的多个值

时间:2013-07-02 03:42:01

标签: javascript javascript-objects

我有一个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' ]

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

2 个答案:

答案 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'(来自第二次迭代)