首页 > 解决方案 > 未能设置矩阵单元格值

问题描述

为什么当我这样做时:

let matrix = Array(3).fill(new Array(3).fill(0));
matrix[0][1] = 1

我希望矩阵是:

    [ [0,1,0],
      [0,0,0],
      [0,0,0]  ]

但是,矩阵看起来像这样:

   [ [0,1,0],
     [0,1,0],
     [0,1,0] ]

所以它设置了整个列,而不仅仅是单元格。我觉得我在这里错过了一个非常重要的语言。

先感谢您!

标签: javascriptecmascript-6

解决方案


因为您在内存中对所有索引使用相同的引用。

想象这是内存,索引指向内存中的相同值,因此,特定索引的每次更改都会修改该值

    new Array(3).fill(0)     Matrix
    +---------+           +-----------+
    | [0,0,0] | <--+------|   Index 0 |
    +---------+    |      +-----------+
          ^        +------|   Index 1 |
          |               +-----------+
          +---------------|   Index 2 |
                          +-----------+

为每个索引创建一个新数组

    {length: 3}, () => Array(3).fill(0)     Matrix
    +---------+                         +-----------+
    | [0,0,0] | <-----------------------|   Index 0 |
    +---------+                         +-----------+
    | [0,0,0] | <-----------------------|   Index 1 |
    +---------+                         +-----------+
    | [0,0,0] | <-----------------------|   Index 2 |
    +---------+                         +-----------+

let matrix = Array.from({length: 3}, () => Array(3).fill(0));
matrix[0][1] = 1;

console.log(matrix);


推荐阅读