我正在尝试获取一个数组inArray
,该数组随for()
循环的每次迭代而变化,并将其推送到多维数组medArray
。下面有两种不同的方法略有不同,一种实现了目标,而第二种输出medArray
,其中有三个数组,它们都等于inArray
的最后一次迭代。
我很困惑为什么会这样:
var inArray = [1, 2, 3];
var medArray = [];
for(i = 0; i < 3; i++){
inArray[i] += 1;
//The difference is this line below
var test = [inArray[0], inArray[1], inArray[2]];
medArray.push(test)
console.log(medArray);
}
但这不起作用:
var inArray = [1, 2, 3];
var medArray = [];
for(i = 0; i < 3; i++){
inArray[i] += 1;
//The difference is this line below
var test = inArray;
medArray.push(test)
console.log(medArray);
}
当我单独将test
的值分配为inArray
的单个值时,它可以工作,但是当我将两个数组分配为相等时,它不起作用。发生了什么事?
答案 0 :(得分:1)
第二个输出
medArray
,其中包含三个数组,它们都等于inArray
的最后一次迭代。
实际上,第二个代码块将相同的数组推送到medArray
三次。当您说temp = inArray
没有创建数组的副本时,它会创建对同一数组的另一个引用。 (因此,如果在循环之后,您要说medArray[0][0] = 10
,您发现medArray[1][0]
和medArray[2][0]
现在都等于10
,因为medArray[0]
},medArray[1]
和medArray[2]
都引用相同的数组。)
如果您想复制inArray
数组,请使用the array .slice()
method:
var temp = inArray.slice();
然后temp
将是一个与inArray
具有相同元素的新数组。这是您使用test = [inArray[0], inArray[1], inArray[2]];
在第一个代码块中执行的操作。
或者您可以省略temp
变量,然后说:
medArray.push(inArray.slice());
(.slice()
如果用参数调用它,也可以用来复制数组的一部分,但是不带参数调用它会复制整个数组。)
在上下文中:
var inArray = [1, 2, 3];
var medArray = [];
for(var i = 0; i < 3; i++){
inArray[i] += 1;
medArray.push(inArray.slice());
}
console.log(medArray);
&#13;