【问题标题】:Create 2D array using new Array().fill(0) bug? [duplicate]使用 new Array().fill(0) 错误创建二维数组? [复制]
【发布时间】:2016-08-04 07:24:36
【问题描述】:

我想创建一个二维数组,但我发现了一个有趣的行为

const column = 10;
const row = 10;

let matrix = new Array(row).fill(new Array(column).fill(0));

matrix[0][1] = 1;

console.log(matrix)

令我惊讶的是,我得到如下结果:

0 2 0 0 0 0 0 0 0 0 
0 2 0 0 0 0 0 0 0 0 
0 2 0 0 0 0 0 0 0 0 
0 2 0 0 0 0 0 0 0 0 
0 2 0 0 0 0 0 0 0 0 
0 2 0 0 0 0 0 0 0 0 
0 2 0 0 0 0 0 0 0 0 
0 2 0 0 0 0 0 0 0 0 
0 2 0 0 0 0 0 0 0 0 
0 2 0 0 0 0 0 0 0 0 

整个列号 1 设置为 1,请问我为什么会出现这种情况?

【问题讨论】:

  • 所有数组元素都指向一个数组
  • @PranavCBalan 你介意解释一下吗?
  • new Array(column).fill(0) 创建一个长度为column 且元素为0 的数组。 new Array(row).fill(....) 填充您创建的数组,它不会为每个数组创建不同的数组...而是对数组的引用充当元素

标签: javascript arrays


【解决方案1】:

Array#fill 方法使用相同的数组填充元素是对单个数组的引用。因此,您需要创建单独的数组作为元素。因此,更新一个将反映所有其他,因为它们不是不同的数组,它们是相同的。

使用Array.from(),您可以通过map function创建和生成值。

const column = 10;
const row = 10;

let matrix = Array.from({
  // create array of length `row`
  length: row 
  // map function to generate values
}, () => new Array(column).fill(0));

matrix[0][1] = 1;

console.log(matrix)

【讨论】:

  • sry,仍然不明白..为什么它引用单个数组?因为它会生成 row 次新数组?
  • @Tim :首先它创建一个长度为row 的数组,然后用一个数组填充.....填充就像matrix[0] = matrix[1] = .. = matrix[row - 1] = new Array(column).fill(0); 一样,所以所有数组元素都引用同一个数组....
  • @Tim : 数组就像ref=[.....];[ref,ref,ref,...,ref] ....
【解决方案2】:

@PranavCBalan 有权利。

是这样的:

let matrix = new Array(row);
var x = new Array(column).fill(0);
matrix[0] = matrix[1] = .. = matrix[column - 1] = x;

您的矩阵是一个对象的数组。

【讨论】:

    猜你喜欢
    • 2012-01-12
    • 2017-04-05
    • 2021-12-19
    • 2021-02-08
    • 2021-09-16
    • 2017-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多