如何在二维javascript数组中设置一个值

时间:2017-04-07 19:29:01

标签: javascript arrays

我试图在二维数组中设置单个值,但它不起作用。

请考虑以下有关该主题的许多示例中的代码:

// 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不支持在二维数组中设置值?

2 个答案:

答案 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.