js 快速创建二维数组并初始化

前端1 min
#JavaScript
目录(6)

前言

笔者喜欢用 js 写 leetcode 偶尔需要初始化二维数组,后来找了一些有效的方式,但是踩了一些坑,遂记录一下相关实践。

结果前置,后面篇幅讲述详情:

  1. 初始化一维数组
const arr = new Array(n).fill(0);
  1. 初始化二维数组
const arr = Array.from({ length: n }, () => new Array(m).fill(0))

或者

const arr = new Array(n).fill(0).map(() => new Array(m).fill(0));

二维数组

涉及API

首先介绍几个 API:

  • new Array(num: number)

    Array 类的构造函数,可以创建一个长度为 n 的稀疏数组,元素全部为 undefined。

  • Array.prototype.fill(value: any)

    将 value 填充至数组。重点,当 value 是对象时,数组的每一项都会引用该元素。

  • Array.from(arrayLike)

    可迭代对象和类数组对象,转为数组

一维数组

通过上文提到的API,就可以很方便的构造一个一维数组并初始化了,常用方法:

const arr = new Array(n).fill(0);
const arr = Array.from({ length: n }, () => 0);

二维数组

初始化二维数组的思想主要是在一维数组的基础上,进行嵌套,然后填充元素。 里面有个比较坑的点是 fill() 方法,它的元素引用的是同一个对象,所以要杜绝以下写法。

const arr = new Array(n).fill(new Array(m).fill(0)); // 错误示范
// 如果尝试给某个元素赋值,就会影响到其它行的元素
arr[0][0] = 1; // 此时 [i][0] 此列均为 1

还有另外一个坑,是采用 map() 方法时,map() 会过滤空元素。要知道我们 new Array(n) 出来的数组是稀疏数组

const arr = new Array(n).map(() => new Array(m).fill(0)); // 错误示范
console.log(arr);// n 个空元素

因此创建二维数组,可以采用以下两种方法:

  • 填充稀疏数组后,再使用 map()
const arr = new Array(n).fill(0).map(() => new Array(m).fill(0));
  • 采用 Array.from() 方法
const arr = Array.from({ length: n }, () => new Array(m).fill(0))

相关链接