javascript填充圆形数组

时间:2017-08-31 01:59:18

标签: javascript multidimensional-array

我试图创建一个0初始化的2d数组。我有两个测试应该是相同的,但它们不是。对test1 [x]的任何修改都将导致所有test1 [x]条目匹配。为什么test1的所有子数组都相同?

注意:在codepen上运行它,所有子数组在第一个说[圆形对象Arrray]之后

指向codepen的链接:https://codepen.io/tannyr/pen/qXLmeG?editors=1111



var test1 = Array(2).fill(Array(2).fill(0))

var test2 = [[0,0],[0,0]]

test1[0][0] = 1  // <= Should edit a single value
test2[0][0] = 1

console.log(test1[0], test1[1])  // [1, 0] [1, 0]  <= Should match test 2
console.log(test2[0], test2[1])  // [1, 0] [0, 0]
&#13;
&#13;
&#13;

3 个答案:

答案 0 :(得分:2)

这是因为您要将同一数组的引用添加到test1中的两个元素。 var test1 = Array(2).fill(Array(2).fill(0)) 基本上与

相同
var arr = Array(2).fill(0);
var test1 = Array(2).fill(arr);

由于两个元素都引用了相同的数组,因此如果编辑其中一个更改也会反映在其他数组中。 而在... var test2 = [[0,0],[0,0]] 您正在为test2的两个元素添加两个单独的数组,因此您可以单独编辑它们。

你也可以使用循环来填充数组元素,如下所示:

var test1 = [];
for(var i=0; i<2; i++)
   test1.push([0,0]);

答案 1 :(得分:1)

这有点棘手,但是当你以这种方式使用填充时,它会生成一个数组,然后将其放入所有填充位置。你可以做你想做的事就是说Array(2).fill().map(() => [0, 0])

这将初始化阵列中的所有插槽,然后将您需要的值映射到新插槽中。

答案 2 :(得分:0)

Array(2).fill(0)创建一个数组,而外语Array(2).fill似乎两次添加确切创建的数组。这意味着test1数组中的两个项都引用同一个数组。因此,如果更改一个数组中某个元素的值,则考虑到两个数组都指向同一位置,它会更改两个数组中的元素。 记住它的工作顺序。您正在调用函数并传递值。它只会评估内部函数一次,得到它的返回类型并在外部函数中使用它。