在JavaScript中初始化二维数组

时间:2018-04-24 13:11:25

标签: javascript arrays

我想创建一个二维数组,用布尔值初始化,设置为false。目前我正在使用这种数组创建方法:

const rows = 3
const cols = 5

const nestedArray = new Array(rows).fill(
    new Array(cols).fill(false)
)

nestedArray看起来不错,但只要我更改nestedArray[0][2]的值,nestedArray[1][2]nestedArray[2][2]的值也会发生变化。

我想这是因为子数组是相同的,可能是因为它们通过引用而不是通过值填充到父数组中。

创建一组不相同的子数组会是一种优雅而有效的方法吗?

6 个答案:

答案 0 :(得分:6)

您可以使用嵌套的Array.from()来电:

const rows = 3
const cols = 5

const nestedArray = Array.from({ length: rows }, () => 
  Array.from({ length: cols }, () => false)
);
  
nestedArray[0][1] = 'value'; // example of changing a single cell
  
console.log(nestedArray);

答案 1 :(得分:3)

您可以使用Array.from方法创建第二个参数为map方法的行,并为列创建Array.fill



const rows = 3
const cols = 5

const nestedArray = Array.from(Array(rows), _ => Array(cols).fill(false));
nestedArray[0][1] = true;
console.log(nestedArray)




另一种方法是在行数组上使用扩展语法...,这样就可以在该数组上使用map方法。



const rows = 3
const cols = 5

const nestedArray = [...Array(rows)].map(_ => Array(cols).fill(false))
nestedArray[0][1] = true;
console.log(nestedArray)




答案 2 :(得分:0)

const nestedArray = Array(rows).fill(false).map(x => Array(cols).fill(false))

尝试这个

答案 3 :(得分:0)

可能是这样的:



const rows = 3
const cols = 5

const nestedArray = new Array(rows).fill(0);

nestedArray.forEach((e, i, a) => a[i] = new Array(cols).fill(false));

console.log(nestedArray);




  • 首先,使用虚拟值
  • 初始化数组
  • 然后,为每个位置初始化另一个嵌套数组

答案 4 :(得分:0)

Ori Drori 的答案非常相似,但要短一些:

const rows = 3;
const cols = 5;

const nestedArray = Array.from({length: rows}, () => Array(cols).fill(false));
nestedArray[1][2] = true;
console.log(nestedArray);

答案 5 :(得分:0)

已经有很多答案了,但也许有人觉得这个更易读:

let rows = 3;
let columns = 5;
let rowTemplate = Array(columns).fill(false);
let matrix = Array.from(Array(rows), () => [...rowTemplate]);

matrix[1][3] = true;
/*
[
  [ false, false, false, false, false ],
  [ false, false, false, true, false ],
  [ false, false, false, false, false ]
]
*/