Javascript Array.push方法问题

时间:2012-06-27 16:38:47

标签: javascript

我有以下代码:

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]]

我显然没有对阵列工作方式有所了解。每个单独的数组都是正确的,但是当我将它们推送到组合数组时,有些事情就会失败。它是什么?

3 个答案:

答案 0 :(得分:5)

每次将同一个数组推入组合数组时;即,所有引用都指向内存中的同一实例。所以当你更新一个时,你实际上已经全部更新了它们。

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

答案 1 :(得分: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
}

DEMO

答案 2 :(得分: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) 

Reference