Skip to content

如何在JavaScript中初始化二维数组?

二维数组,也被称为矩阵,在许多编程领域中非常常见。虽然一些语言提供了内置的方法来初始化二维数组,但JavaScript没有。

使用特定值初始化二维数组

给定一个宽度高度,您可以创建一个二维数组,并用特定的值填充它。使用Array.from()Array.prototype.map()生成与height相等的行,其中每一行都是大小为width的数组。使用Array.prototype.fill()将所有项初始化为所需的值。

const initialize2DArray = (width, height, val = null) =>
  Array.from({ length: height }).map(() =>
    Array.from({ length: width }).fill(val)
  );

initialize2DArray(2, 2, 0); // [[0, 0], [0, 0]]

使用特定值初始化n维数组

上述代码片段的更通用版本可用于使用特定值初始化n维数组。其核心技术相同,只是使用了剩余参数和递归来处理任意数量的维度。

const initializeNDArray = (val, ...args) =>
  args.length === 0
    ? val
    : Array.from({ length: args[0] }).map(() =>
        initializeNDArray(val, ...args.slice(1))
      );

initializeNDArray(1, 3); // [1, 1, 1]
initializeNDArray(5, 2, 2, 2); // [[[5, 5], [5, 5]], [[5, 5], [5, 5]]]

使用map函数初始化一个二维数组

一个更复杂的场景可能涉及使用生成的值序列来初始化一个二维数组。例如,你可能想要为一个网格生成一个二维坐标数组。将Array.prototype.fill()替换为Array.prototype.map()允许我们使用一个map函数来生成这些值。

const initializeMapped2DArray = (width, height, mapFn = () => null) =>
  Array.from({ length: height }).map((_, i) =>
    Array.from({ length: width }).map((_, j) => mapFn(i, j))
  );

initializeMapped2DArray(2, 2, (x, y) => `(${x}, ${y})`);
// [['(0, 0)', '(0, 1)'], ['(1, 0)', '(1, 1)']]

初始化一个倾斜的二维数组

倾斜的二维数组是指每行的长度不相同的数组。一个简单的例子是一个三角形,其中每行的长度等于它的索引。在这种情况下,我们可以用一个计算每行长度的函数来替换数值型的width参数。

const initializeSkewed2DArray = (
  height,
  widthFn = () => height,
  mapFn = () => null
) =>
  Array.from({ length: height }, (_, i) =>
    Array.from({ length: widthFn(i) }).map((_, j) => mapFn(i, j))
  );

initializeSkewed2DArray(
  5,
  i => i + 1,
  (x, y) => x * y
);
// [[0], [0, 1], [0, 2, 4], [0, 3, 6, 9], [0, 4, 8, 12, 16]]