在Javascript中将数组推送到多维数组

时间:2016-09-25 05:31:47

标签: javascript arrays multidimensional-array

我正在尝试获取一个数组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的单个值时,它可以工作,但是当我将两个数组分配为相等时,它不起作用。发生了什么事?

1 个答案:

答案 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()如果用参数调用它,也可以用来复制数组的一部分,但是不带参数调用它会复制整个数组。)

在上下文中:

&#13;
&#13;
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;
&#13;
&#13;