2016-11-21 178 views
0

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调用九次,似乎调用它一次,填补由创建对象的新Array九引用。当然,如果我在这些子数组中改变了一个值,那么对于所有的子数组,这个值在相同的索引处被改变。

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

+1

使用'[...阵列(9)]图(emptyRow)' –

+1

您使用的单个阵列作为用于'值。 fill',这意味着它将使用同一个数组填充数组九次,而数组是对象,这意味着它们通过引用一个值来传递,所以基本上最终会有九次相同的数组。 – adeneo

+0

谢谢@Guedes,那就是我所需要的。 – GeckStar

回答

2

Array#fill不会帮你,它接受返回的值,已经创建的对象。您可以使用接受函数的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); 
} 
+3

或者'阵列。从({length:9},emptyRow)' – loganfsmyth

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

您可以设置矩阵的长度

0

地图的其他解决方案()

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

0

您可以使用Array.from()创造任何你想要的长度的数组,并进行初始化:

const createMatrix = (x, y) => Array.from({ length: x },() => 
 
    Array.from({ length: y },() => 0) 
 
); 
 

 
const result = createMatrix(9, 5); 
 

 
console.log(result);

0

您可以使用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));