我有以下代码:
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]]
我显然没有对阵列工作方式有所了解。每个单独的数组都是正确的,但是当我将它们推送到组合数组时,有些事情就会失败。它是什么?
答案 0 :(得分:5)
每次将同一个数组推入组合数组时;即,所有引用都指向内存中的同一实例。所以当你更新一个时,你实际上已经全部更新了它们。
如果您需要单独的引用,则需要创建单独的数组。
答案 1 :(得分: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
}
答案 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)