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

每次将相同的数组推入组合数组时;即,所有引用都指向内存中的同一个实例。因此,当您更新一个时,实际上您已经更新了所有这些。

如果您想要单独的引用,则需要创建单独的数组。

于 2012-06-27T16:43:07.260 回答
3

shift你是这里的slice朋友吗:

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 回答