【问题标题】:Setting one value in 3D array mutates others values在 3D 数组中设置一个值会改变其他值
【发布时间】:2018-02-02 06:20:48
【问题描述】:

我在一行中用 0 初始化一个 2x2 3D 数组:

let matrix = new Array(2).fill(new Array(2).fill(0));

这会导致

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

执行matrix[0][0] = 1 会导致:

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

这里发生了什么?为什么两个0-th 索引都设置为1

【问题讨论】:

标签: javascript


【解决方案1】:

fill() 方法使用静态值填充数组中从开始索引到结束索引的所有元素。

在您的情况下let matrix = new Array(2).fill(new Array(2).fill(0));new Array(2).fill(0) 被评估一次,它的引用被提供给所有外部数组。因此,每个外部数组都引用同一个内部数组。因此,修改一个值就是更新所有其他值。

您需要为每一行创建不同的新数组引用。下面的代码为每个索引创建一个新的内部数组。

let matrix = Array.from({length: 2}, _ => new Array(2).fill(0));
console.log(matrix);
matrix[0][0] = 1;
console.log(matrix);

【讨论】:

    【解决方案2】:

    在您的实现中,矩阵是一个包含两个元素的数组,这两个元素是同一个对象。考虑另一个没有这个问题的二维数组构造函数,比如这个。

    function zeros(width, height){
        matrix = new Array(height);
        for(var i = 0; i < height; i++){
            matrix[i] = new Array(width).fill(0);
        }
        return matrix;
    }
    
    var matrix = zeros(2, 2);
    console.log(matrix); //before changes
    matrix[0][0]=1;
    console.log(matrix); //after changes

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-20
      • 2016-01-20
      相关资源
      最近更新 更多