我正在使用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
?
答案 0 :(得分:3)
fill()方法将数组的所有元素从起始索引填充到具有静态值的结束索引。
在您的let matrix = new Array(2).fill(new Array(2).fill(0));
案例中,new Array(2).fill(0)
被评估一次,其引用将提供给所有外部数组。因此,每个外部数组都引用相同的内部数组。因此,修改值会更新所有其他值。
您需要为每一行创建不同的新数组引用。下面的代码为每个索引创建一个新的内部数组。
let matrix = Array.from({length: 2}, _ => new Array(2).fill(0));
console.log(matrix);
matrix[0][0] = 1;
console.log(matrix);
&#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