单个Javascript对象属性的多个值

Multiple Values for Single Javascript Object Property

本文关键字:属性 Javascript 对象 单个      更新时间:2023-09-26

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

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

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

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

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

即使重用hash变量,您也会得到所需的行为。数组与对象不同。

您从未在第一个循环后清除过数组。因此,您将"bar"answers"baz"添加到数组中,然后将"bam"添加到foo中,再次循环通过foo并获得"bar"、"baz’(来自第一次迭代),然后获得"bar’、"baz'和"bam’(来自第二次迭代)