2013-07-02 17 views
0

我有一個動態構建的JavaScript對象。我想在迭代期間替換可能已經存在的新屬性 - 基本上像Java HashSet一樣處理對象。單個Javascript對象屬性的多個值

爲什麼當你爲javascript對象添加一個動態屬性,然後用for for循環遍歷該對象時,你會得到該屬性的多個值或其他奇怪的行爲?

例子:

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

你寫了'bam',而不是'bar',所以'bar'不會被修改。 – Blender

+0

那些額外的特性是故意存在的,但Ehtan的答案突出顯示了真正的問題,即它按預期工作,但我拉動了小動作! – binarygiant

回答

4

對象屬性按照您期望的方式工作。問題是你沒有清除arr數組;所以你只是把相同的屬性堆在它上面。嘗試在第二個循環之前放arr = [];,你應該是金色的。

可以使用對象像散列;相反,如果你有這樣的:

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

你會得到你想要的行爲,即使你再使用hash變量。數組不像對象。

+1

可笑,我一直在盯着這個太久,我的代碼(沒有顯示)有錯誤的地方陣列)...感嘆。謝謝你的回答... – binarygiant

+0

heh。我們都有這樣的日子,@binarygiant。在美好的日子裏,我們不會讓自己變成傻瓜。在糟糕的日子裏,好吧......這是一件寬容的事! –

1

在第一次循環之後,您從未清除數組。所以你在數組中添加'bar'和'baz',然後給foo添加'bam',再次循環foo並得到'bar','baz'(從第一次迭代開始),然後是'bar','baz'和'bam'(來自第二次迭代)

相關問題