2017-04-20 11 views
1

私は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'でなければなりません。ありがとう

+0

あなたが同じ配列を推進しています。 JS内のオブジェクトは参照を使用して渡されます。 –

+0

は実際の出力が正しいですか? @ibrahimmahrirは正しいですが、それは[a、2、b]のようにそれぞれではありませんか? – aw04

+0

@ aw04これは有名なコンソールログの混乱です。最初のツリー行は、ループ内で別々に記録されます。最後の行は配列を展開するまで値を表示しない 'arrays'のログです。 –

答えて

1

JavaScriptのオブジェクトは参照渡しされます。

同じアレイインスタンスを3回プッシュしています。

各繰り返しで新しい配列を作成する必要があります。特に
は、おそらく既存のものをコピーしたい:

array = array.slice(); 
+0

ok。私は理解しない。ありがとう!! – Rob

0

は、ポインタを参照する問題です。スライス()を使用します。あなたが最初の配列への参照を使用していたこのコード

var arrays = []; 
 
var array = []; 
 

 
//I want the 'array' '0' and '2' elements to stay the same 
 
array[0] = "a"; 
 
array[2] = 'c'; 
 

 
for(i=0; i<3; i++){ 
 
    var newarray = array.slice();; 
 
    newarray[1] = i; 
 
    arrays.push(newarray); 
 
    } 
 
console.log(arrays);

0

を確認し、それゆえ、最終的な配列内のすべての値が初期配列の最後の値で更新なっていました。スライス()を使用すると、配列の浅いコピーが作成されます。ここでは完全な説明は次のとおりです。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/slice?v=control

var arrays = []; 
 
var array = []; 
 

 
//I want the 'array' '0' and '2' elements to stay the same 
 
array[0] = "a"; 
 
array[2] = 'c'; 
 

 
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' 
 
var temp =array; 
 
    arrays.push(array.slice());  
 
    console.log(array); 
 
}//end for 
 
console.log(arrays);

関連する問題