Array.fill(Array) erstellt Kopien nach Referenzen, nicht nach Wert [duplicate]

Lesezeit: 3 Minuten

ArrayfillArray erstellt Kopien nach Referenzen nicht nach Wert duplicate
XCS

Ich versuche, eine 6 x 12-Matrix zu erstellen Array.fill

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

Während dies funktioniert, besteht das Problem darin, dass die inneren Arrays tatsächlich alle auf dasselbe verweisen 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

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

Wie kann ich zwingen Array.fill Füllen Sie Copy-by-Werte des angegebenen Arguments (z. B.: Array(12).fill(0) ist das Argument in meinem Fall) anstatt durch Verweis zu kopieren?

  • Du kannst nicht zwingen Array.fill() etwas anderes zu tun als das, was es bereits tut. Sie können natürlich Ihre eigene Funktion schreiben, um dies zu tun.

    – Spitze

    21. Juni 2016 um 16:28 Uhr

  • @Pointy Du hast Recht, ein zweiter Parameter zum Ausfüllen für “Deep-Copy” wäre nützlich 🙂

    – XCS

    21. Juni 2016 um 16:33 Uhr

  • Es könnte nett sein, eine Art Generatorfunktion übergeben zu können.

    – Rose Kunkel

    21. Juni 2016 um 16:35 Uhr

  • Verwenden Sie lodashes Deep Clone und es wird die Referenzen entfernen

    – Ben Hase

    21. Juni 2016 um 17:10 Uhr

  • @WilliamKunkel: In den meisten Anwendungsfällen könnten Sie es einfach tun Array.from(generator) statt so etwas wie Array(6).fillBy(generator, 0, 6)

    – Bergi

    21. Juni 2016 um 17:11 Uhr

1646178907 429 ArrayfillArray erstellt Kopien nach Referenzen nicht nach Wert duplicate
KevBot

Du könntest benutzen Array.from() stattdessen:

Dank an Pranav C Balan in den Kommentaren für den Vorschlag, dies weiter 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

Ursprüngliche Aussage (oben besser optimiert):

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

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

    – Pranav C. Balan

    21. Juni 2016 um 17:45 Uhr

ArrayfillArray erstellt Kopien nach Referenzen nicht nach Wert duplicate
Spitz

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

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

bearbeiten oh warte, das wird nicht funktionieren; .map() iteriert nicht durch die nicht initialisierten Elemente. Sie könnten es zuerst füllen:

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

  • new Array(6).fill().map(... ? Und mit Pfeilfunktionen sieht es tatsächlich anständig aus.

    – XCS

    21. Juni 2016 um 16:31 Uhr


  • Du könntest es tun [...Array(6)].map(() => Array(12).fill(0))

    – Elclans

    21. Juni 2016 um 16:33 Uhr

  • Dadurch wird jedoch ein neues Array erstellt, anstatt es an Ort und Stelle zu mutieren.

    – Rose Kunkel

    21. Juni 2016 um 16:34 Uhr

  • Ihr Kinder mit euren schicken neuen Sprachfeatures müsst von meinem Rasen runter

    – Spitze

    21. Juni 2016 um 16:34 Uhr

  • @ Pointy: Ich denke Array.from(Array(6)).map(…) ist sowieso besser lesbar als dieser hässliche Spread-Operator 🙂

    – Bergi

    21. Juni 2016 um 17:04 Uhr

ArrayfillArray erstellt Kopien nach Referenzen nicht nach Wert duplicate
Pranav C. Balan

Du kannst es nicht mit Array#fill Methode. Iterieren Sie stattdessen ü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]);

  • Ich weiß, dass ich es mit einer Schleife erstellen kann, aber das wollte ich von Anfang an vermeiden. 😀

    – XCS

    21. Juni 2016 um 16:34 Uhr

906190cookie-checkArray.fill(Array) erstellt Kopien nach Referenzen, nicht nach Wert [duplicate]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy