在3D数组中设置一个值会改变其他值

时间:2018-02-02 06:20:49

标签: javascript

我正在使用0的一行初始化2x2 3D数组:

    <ItemTemplate>
 <asp:Label ID="Label1" runat="server"  Text='<%# Eval("bookingName") %>'></asp:Label>                   
 </ItemTemplate>

这导致

let matrix = new Array(2).fill(new Array(2).fill(0));

执行[[0,0], [0,0]] 会导致:

matrix[0][0] = 1

这里发生了什么?为什么两个[[1, 0],[1, 0]] 个版权都设置为0-th

2 个答案:

答案 0 :(得分:3)

  

fill()方法将数组的所有元素从起始索引填充到具有静态值的结束索引。

在您的let matrix = new Array(2).fill(new Array(2).fill(0));案例中,new Array(2).fill(0)被评估一次,其引用将提供给所有外部数组。因此,每个外部数组都引用相同的内部数组。因此,修改值会更新所有其他值。

您需要为每一行创建不同的新数组引用。下面的代码为每个索引创建一个新的内部数组。

&#13;
&#13;
let matrix = Array.from({length: 2}, _ => new Array(2).fill(0));
console.log(matrix);
matrix[0][0] = 1;
console.log(matrix);
&#13;
&#13;
&#13;

答案 1 :(得分:1)

在您的实现中,matrix是一个包含两个元素的数组,这两个元素是同一个对象。考虑另一个没有这个问题的2d数组构造函数,例如这个。

function zeros(width, height){
    matrix = new Array(height);
    for(var i = 0; i < height; i++){
        matrix[i] = new Array(width).fill(0);
    }
    return matrix;
}

var matrix = zeros(2, 2);
console.log(matrix); //before changes
matrix[0][0]=1;
console.log(matrix); //after changes