【问题标题】:new Array(_).fill(object) does not create new instances of object [duplicate]new Array(_).fill(object) 不会创建对象的新实例 [重复]
【发布时间】:2017-04-05 00:52:29
【问题描述】:

ES6 允许我们用某个值填充Array

function emptyRow() {
    return new Array(9).fill(0);
}

此函数返回一个长度为 9 的 Array,仅填充零:

>> emptyRow()
<< Array [ 0, 0, 0, 0, 0, 0, 0, 0, 0 ]

现在我想生成一个Array,其中填充了其中的九个空行。

function emptyMatrix() {
    return new Array(9).fill(emptyRow());
}

然而,fill 不是调用了九次emptyRow(),而是似乎调用了一次,并用对emptyRow() 创建的对象的九个引用填充了新的Array。自然,如果我更改任何这些子数组中的值,则该值会在所有子数组的相同索引处更改。

有没有办法为每个条目创建一个新对象?

【问题讨论】:

  • 使用[...Array(9)].map(emptyRow)
  • 您使用单个数组作为fill 的值,这意味着它将用相同的数组填充数组九次,并且数组是对象,这意味着它们通过引用值传递,所以基本上你会得到九次相同的数组。
  • 谢谢@Guedes,这正是我所需要的。
  • 马达拉的回答比我的更可取(因为兼容性),无论如何我很高兴它有帮助:)

标签: javascript arrays ecmascript-6


【解决方案1】:

Array#fill 不会帮你,它接受 emptyRow() 返回的值,已经创建的对象。您可以使用接受函数的Array#map,尽管您将无法使用new Array() 构造函数。这是最简单的方法:

function emptyMatrix() {
  Array.apply(null, {length: 9}).map(emptyRow);
  // create the array            fill in values
}

或者,更一般地说:

function generateArray(n, valueFactory) {
  return Array.apply(null, {length: n}).map(valueFactory);
}

【讨论】:

  • 或者Array.from({length: 9}, emptyRow)
【解决方案2】:

ma​​p() 的另一种解决方案:

var line = new Array(9).fill(0);
var matrix = line.map(x => new Array(9).fill(0))
console.log(matrix);

【讨论】:

    【解决方案3】:

    您可以使用Array.from() 生成特定长度的数组,然后使用Array.prototype.map() 填充空行:

    const emptyRow = () => Array(9).fill(0);
    
    const generateArray = (n, valueFactory) => Array.from({length: 9}).map(valueFactory);
    
    console.log(generateArray(9, emptyRow));

    【讨论】:

      【解决方案4】:

      您可以使用Array.from() 创建任意长度的数组,并对其进行初始化:

      const createMatrix = (x, y) => Array.from({ length: x }, () =>
        Array.from({ length: y }, () => 0)
      );
      
      const result = createMatrix(9, 5);
      
      console.log(result);

      【讨论】:

        【解决方案5】:

        function emptyMatrix(length) {
          var matrix = new Array();
          for (var i = 0; i < length; i++)
            matrix[i] = new Array(length).fill(0)
          return matrix
        
        }
        console.log(emptyMatrix(5))

        您可以设置矩阵的长度

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-02-08
          • 1970-01-01
          • 2021-11-02
          • 1970-01-01
          相关资源
          最近更新 更多