私はJavascriptのnoobです。 forループで生成された配列をグローバル配列に保存すると予期しない結果が発生しています。グローバル配列は、forループの最後の反復で保存された最後の項目だけで満たされます。私はこれを理解して研究しようと一日を費やしましたが、私は飽和し、困惑しています。javascript - forループ内の配列を空のグローバル配列にプッシュ - グローバルに最後にプッシュされた項目を埋めますか?
これは私の問題を単純に抽象化したものです。
[a, 0, b]
[a, 1, b]
[a, 2, b]
[[a, 0, b,], [a, 0, b], [a, 0, b]]
私が望んでいたと予想される:「配列」が唯一の最後の配列で満たされている理由を私は理解していない
[a, 0, b]
[a, 1, b]
[a, 2, b]
[[a, 1, b,], [a, 2, b], [a, 3, b]]
何が出力されることはあり
var arrays = [];
var array = [];
//I want the 'array' '0' and '2' elements to stay the same
array[0] = "a";
array[2] = 'b';
for(i=0; i<3; i++){
//i'd like to change the array[1] element in the loop
array[1] = i;
//and accumulate the changed 'array' from each loop iteration in 'arrays'
arrays.push(array);
console.log(array);
}//end for
console.log(arrays);
forループ? forループの各反復で、変更された配列をどのように累積することができますか?
私は明らかに何かここで基本的なことを理解していないが、私はこの時点で飽和している。アドバイスありがとう。
更新:ありがとうございました! - 私は今、私が '配列'への参照を '配列'にプッシュしていたことを理解しています。同じ参照が毎回押されたので、 '配列'のすべての要素はちょうど最新の配列になります。 .slice()で新しい配列を '配列'にプッシュする必要があります。また、私が修正した私の元の投稿に誤りがありました。 array [2] = 'c'は配列[2] = 'b'でなければなりません。ありがとう
あなたが同じ配列を推進しています。 JS内のオブジェクトは参照を使用して渡されます。 –
は実際の出力が正しいですか? @ibrahimmahrirは正しいですが、それは[a、2、b]のようにそれぞれではありませんか? – aw04
@ aw04これは有名なコンソールログの混乱です。最初のツリー行は、ループ内で別々に記録されます。最後の行は配列を展開するまで値を表示しない 'arrays'のログです。 –