2016-06-21 9 views
4

Ich versuche, eine 6 x 12 Matrix Array.fillArray.fill (Array) erstellt Kopien von Artikeln nicht von Wert

let m = Array(6).fill(Array(12).fill(0)); 

mit erstellen Während dies funktioniert, ist das Problem, dass die inneren Arrays sind eigentlich alle referenziert das gleiche Array Objekt.

let m = Array(6).fill(Array(12).fill(0)); 
m[0][0] = 1; 
console.log(m[1][0]); // Outputs 1 instead of 0 

wollte ich (und erwartete) den Wert von m[1][0]0 zu sein.

Wie kann ich forcieren copy-by-Werte des angegebenen Arguments (zB: Array(12).fill(0) ist das Argument in meinem Fall) anstelle des Kopierens durch Referenz?

+3

Sie nicht 'Array.fill()' etwas anderes zu tun, zwingen kann, als das, was es schon tut. Sie können natürlich Ihre eigene Funktion schreiben. – Pointy

+0

@Pointy Sie haben Recht, ein zweiter Parameter für "Deep-Copy" wäre nützlich :) – Cristy

+1

Es könnte schön sein, eine Generator-Funktion irgendeiner Art zu übergeben. –

Antwort

2

Sie können es nicht mit .fill(), aber Sie können verwenden .map():

let m = new Array(6).map(function() { return new Array(12); }); 

bearbeiten oh, das warten wird nicht funktionieren; .map() wird nicht durch die nicht initialisierten Elemente durchlaufen. Man könnte es füllen zuerst:

let m = new Array(6).fill(null).map(function() { return new Array(12); }); 
+1

' neue Array (6) .fill(). Map (... '? Und mit Pfeilfunktionen sieht es eigentlich anständig aus. – Cristy

+0

@Cristy ja das sollte funktionieren. – Pointy

+2

Sie könnten' [... Array (6) ] .map (() => Array (12) .fill (0)) ' – elclanrs

2

Sie es nicht mit Array#fill Methode tun. Stattdessen iterieren Sie über das Array und fügen Sie das neu erstellte Array mit einer for-Schleife hinzu.

let m = Array(6); 
 
for (var i = 0; i < m.length; i++) 
 
    m[i] = Array(12).fill(0) 
 

 
m[0][0] = 1; 
 
console.log(m[1][0]);

+0

Ich weiß, ich kann es mit einer Schleife erstellen, aber das ist, was ich in erster Linie vermeiden wollte. : D – Cristy

3

könnten Sie Array.from() statt:

Dank Pranav C Balan in den Kommentaren für den Vorschlag weiter diese zu verbessern.

let m = Array.from({length: 6}, e => Array(12).fill(0)); 
 

 
m[0][0] = 1; 
 
console.log(m[0][0]); // Expecting 1 
 
console.log(m[0][1]); // Expecting 0 
 
console.log(m[1][0]); // Expecting 0


Original-Statement (Better oben optimiert):

let m = Array.from({length: 6}, e => Array.from({length: 12}, e => 0)); 
+0

wow, das ist wirklich eine schöne Art und Weise es zu tun, +1 –

+0

'let m = Array.from ({Länge: 6}, e => Array (12) .fill (0));' –

+1

@PranavCBalan , genial! Danke für den Verbesserungsvorschlag. Sogar sauberer. – KevBot