1

次のコードがあります。

function build_all_combinations(input_array){
   array = [1,2,3]
   limit = array.length - 1
   combo = []

   for(i = 0; i<= limit; i++){
      splice_value = array.splice(0,1)
      push_value = splice_value[0]
      array.push(push_value)
      console.log(array) 
      combo.push(array) 
   }
   console.log(combo) 
}

どの出力:

[2, 3, 1]
[3, 1, 2]
[1, 2, 3]
[[1, 2, 3], [1, 2, 3], [1, 2, 3]]

最後の行は次のようになります。[[2, 3, 1],[3, 1, 2],[1, 2, 3]]

私は明らかに、配列の動作方法について何かを理解していません。個々の配列はそれぞれ正しいですが、それらをコンボ配列にプッシュしようとすると、途中で何かが失敗します。それは何ですか?

4

3 に答える 3

5

同じ配列をコンボ配列にプッシュするたびに。つまり、すべての参照がメモリ内の同じインスタンスを指しています。したがって、1 つを更新すると、実際にはすべてを更新したことになります。

別の参照が必要な場合は、別の配列を作成する必要があります。

于 2012-06-27T16:43:07.260 に答える
3

shiftsliceあなたの友達はここにいます:

var array = [1,2,3];
var combo = []
for(var i = 0; i<array.length; i++){
  array.push(array.shift());  // remove first element (shift) and add it to the end (push)
  combo.push(array.slice());  // add a copy of the current array to combo
}

デモ

于 2012-06-27T17:04:19.703 に答える
2

jordan002がこの動作について説明しています。

これが回避策です。

array = [1,2,3]
limit = array.length - 1
combo = []
for(i = 0; i<= limit; i++){
 splice_value = array.splice(0,1)
 push_value = splice_value[0];
 array.push(push_value);
 console.log(array);
 combo.push(array.concat([]));
}
console.log(combo);  

tempコピーを変数に格納できます。

array = [1,2,3]
limit = array.length - 1
combo = []
for(i = 0; i<= limit; i++){
 splice_value = array.splice(0,1)
 push_value = splice_value[0];
 array.push(push_value);
 console.log(array);
 var temp = array.slice();  
 combo.push(temp);
}
console.log(combo) 

参照

于 2012-06-27T16:48:06.950 に答える