new Array(_)。fill(object)不会创建对象的新实例

时间:2016-11-21 15:12:07

标签: javascript arrays ecmascript-6

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()九次,它似乎只调用一次,并使用Array创建的对象的九个引用填充新emptyRow()。当然,如果我更改任何子数组中的值,则会在所有子数组的相同索引处更改该值。

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

5 个答案:

答案 0 :(得分:2)

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);
}

答案 1 :(得分:0)

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))

您可以设置矩阵的长度

答案 2 :(得分:0)

map()

的其他解决方案

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

答案 3 :(得分:0)

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

&#13;
&#13;
partition by
&#13;
&#13;
&#13;

答案 4 :(得分:0)

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

&#13;
&#13;
srp()
&#13;
&#13;
&#13;