我试图在二维数组中设置单个值,但它不起作用。
请考虑以下有关该主题的许多示例中的代码:
// create a 3x3 array with -1 in every position:
let a = new Array(3).fill(new Array(3).fill(-1))
console.log(`a: ${JSON.stringify(a)}`)
a[1][2] = 0
console.log(`a: ${JSON.stringify(a)}`)
输出如下:
a: [[-1,-1,-1],[-1,-1,-1],[-1,-1,-1]]
a: [[-1,-1,0],[-1,-1,0],[-1,-1,0]]
正如我们所看到的,它不是设置单个单元格,而是实际将数组中的3个位置设置为0,即它设置[0] [2]和[1] [2]和[2] [2] = 0.很奇怪。
我试过了:
let a = new Array(3).fill(new Array(3).fill(-1))
console.log(`a: ${JSON.stringify(a)}`)
a[1,2] = 0
console.log(`a: ${JSON.stringify(a)}`)
这给出了更奇怪的结果:
a: [[-1,-1,-1],[-1,-1,-1],[-1,-1,-1]]
a: [[-1,-1,-1],[-1,-1,-1],0]
我是疯了还是javascript不支持在二维数组中设置值?
答案 0 :(得分:6)
那是因为你用相同的子阵列填充外部数组! a[0]
,a[1]
和a[2]
都是相同的数组!因为在JS对象(包括数组)中使用它们的引用传递! array.fill
所做的是采用参数(在本例中是对数组的引用)并将其分配给数组中的每个项目。它是这样的:
var sub = new Array(3);
sub.fill(-1);
var a = [];
a[0] = sub;
a[1] = sub;
a[2] = sub;
a[0][1] = 0;
console.log(sub); // changed too

因为这是array.fill
正在做的事情:
var a = new Array(10);
a.fill(Math.random());
console.log(a); // not 10 different random numbers, but the same random number is assigned to the whole array

它与数组无关。它类似于for循环中使用的comma operator(例如),将表达式分组为一个并返回最后一个的值:
console.log((1, 2)); // 2
console.log((1, 5, "last")); // last
console.log((1, 5, 5 * 11 + 10)); // 65
// the parens are used to distinguish the comma operator from the parameter separator

所以a[1, 2]
与a[2]
相同,因为1, 2
的值为2
!
答案 1 :(得分:1)
您在所有三行中使用相同的参考 new Array(3).fill(-1)填充数组,因此对任何一项的任何更改都会反映在任何地方。
尝试:
var a = new Array(n);
for (var i = 0; i < n; i++) {
a[i] = new Array(n);
}
//where n = 3 for your case.