我无法解决问题。一个非常简单的例子:
var array = [1,2,3];
var test = [0,0];
var result = [];
for (var i=1; i<=array.length; i++){
test[1] = i;
result.push(test);
}
console.log(result);
如果我只是将“i”推入结果,它输出“1,2,3”,但是上面的方法我总是得到“[0,3],[0,3] [0,3]”。这是为什么?我已经阅读了关于闭包的一些解释,但我似乎不理解系统,这使我很难在我的代码中找到其他错误。有没有一种更简单的方法来解决上面的问题,而不是使用函数内部的函数(这似乎是我到目前为止找到的每个等效问题的解决方案)?
答案 0 :(得分:2)
您正在将相同的实例写入结果,当您更改该实例中的参数时,结果中的所有实例都会更改。您需要创建单独的实例来保存数据,这里是用于说明正确方法的代码
var array = [1,2,3];
var test = [0,0];
var result = [];
for (var i=1; i<=array.length; i++){
var z = [test[0], i];
result.push(z);
}
console.log(result);
答案 1 :(得分:2)
关键是当您在JavaScript中替换Array时,它不是复制,而是提供指向Array的链接。 所以
var testArray = [1,2,3];
var copy = testArray;
copy[1] = 10;
console.log(testArray); // [1,10,3]
为避免这种情况,您可以通过.concat()或.slice()
“复制”数组var testArray = [1,2,3];
var copy = testArray.concat(); // or Array.slice(0)
copy[1] = 10;
console.log(testArray) // [1,2,3]
所以你的代码将是
var array = [1,2,3];
var test = [0,0];
var result = [];
for (var i=1; i<=array.length; i++){
test[1] = i;
result.push(test.concat());
}
console.log(result);