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問題は、配列をクリアしていないことです。同じプロパティを積み上げているだけです。2 番目の for ループの前に置いてみてくださいarr = [];。そうすれば、ゴールデンになるはずです。

ハッシュのようなオブジェクトを使用できます。代わりに、これがあった場合:

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' (2 回目の反復から)

于 2013-07-02T03:46:55.657 に答える