在JavaScript中初始化一个二维数组

10

我想创建一个二维数组,其中的布尔值都被初始化为 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] 的值也会被改变。

我想这是因为子数组是相同的,可能是因为它们被以引用的方式而不是以值的方式填入到父数组中。

有什么优雅和高效的方法来创建非相同的子数组的数组呢?


可能重复 https://dev59.com/LmMl5IYBdhLWcg3wwZEq - Steve P
为什么不尝试使用JSON呢? - Mithun Shreevatsa
6个回答

10
您可以使用嵌套的 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);


5
您可以使用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)


1

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

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 ]
]
*/

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

试试这个


1
虽然这个答案可能是正确和有用的,但最好还是附上一些解释来说明它如何帮助解决问题。如果将来发生了变化(可能与此无关),导致它停止工作并且用户需要了解它曾经是如何工作的,这将特别有用。 - Erty Seidohl

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);

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

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);


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接