2016-04-19 12 views
1

Ich arbeite an einem Problem, das seine Ergebnisse in ein 2D-Array ausgibt, Hinzufügen von eins zu jedem Element, wie es geht.Array.prototype.fill() anders als füllen, wie ich gehe

Ich vereinfacht den Code so weit wie möglich, um einen Testfall zu erstellen. Wenn ich das Array als ein fülle ich gehen, wie folgt:

var a = [[], [], [] ,[] ,[], []]; 
var d1, d2; 
for (d1 = 0; d1 < 6; d1++) { 
    for (d2 = 0; d2 < 6; d2++) { 
     a[d1][d2] = (a[d1][d2]) ? (a[d1][d2]) + 1 : 1; 
    } 
} 

ich ein 2D-Array erhalten, wo alle Werte sind 1. Wenn ich jedoch das Array mit array.prototype.fill() prefill wie folgt:

var a = new Array(6).fill(new Array(6).fill(0)); 
var d1, d2; 
for (d1 = 0; d1 < 6; d1++) { 
    for (d2 = 0; d2 < 6; d2++) { 
     a[d1][d2] += 1; 
    } 
} 

Ich bekomme ein 2D-Array voller 6s. Selbst wenn ich a[d1][d2] += 1 mit dem alten a[d1][d2] = (a[d1][d2]) ? (a[d1][d2]) + 1 : 1; ersetze (was noch funktionieren sollte, da sowohl 0 als auch undefined falsch sind), bekomme ich immer noch 6s.

Soweit ich sagen kann, sollte mein Code nur durch jedes Element durchlaufen und eins zum vorherigen Wert hinzufügen. Es sollte kein Element mehr als einmal berühren, also sollten alle 1s sein. Ob ich das Array im Voraus füllte oder nicht, sollte keine Rolle spielen.

Wo ist der Fehler in meinem Verständnis?

+0

Pop-Quiz: Wie viele neue Array-Objekte funktioniert die Zeile 'new Array (6) .fill (new Array (6) .fill (0)); 'erstellen? (Hinweis: Es ist die gleiche Anzahl wie die Anzahl der 'neuen Array'-Aufrufe in der Zeile.) (Tipp # 2: Es ist weniger als 7 ':)'.) – apsillers

Antwort

5

Array.fill soll verwendet werden, um alle Elemente eines Arrays von einem Startindex bis zu einem Endindex mit einem statischen Wert zu füllen.

Dies bedeutet leider, dass wenn Sie ein Element wie ein neues Array übergeben, Ihr Array tatsächlich mit vielen Referenzen auf das gleiche Element gefüllt wird. Mit anderen Worten, a ist nicht mit sechs Arrays der Größe sechs gefüllt; a ist mit sechs Zeigern zu das gleiche Array der Größe sechs gefüllt.

Sie können dies leicht überprüfen in Ihrer Entwicklerkonsole:

var a = new Array(6).fill(new Array(6).fill(0)); 
a 
>>> [Array[6], Array[6], Array[6], Array[6], Array[6], Array[6]] 
a[0] 
>>> [0, 0, 0, 0, 0, 0] 
a[1] 
>>> [0, 0, 0, 0, 0, 0] 
a[0][1] = 1 
a[0] 
>>> [0, 1, 0, 0, 0, 0] 
a[1] 
>>> [0, 1, 0, 0, 0, 0] 
+1

Mit anderen Worten (für die OP-Vorteil), jeder Version von 'a [d1]' ist immer das * genau gleiche Array *, also wird jeder seiner sechs Werte sechsmal vergrößert. – apsillers

+0

@apsillers Igedit, Igeddit. :) Ich habe noch keinen grünen Check gemacht, weil ich gerne etwas warte, falls jemand anders kommt und es noch einfacher oder eleganter erklärt oder etwas enthält, das so funktionieren würde, wie ich es vorhabe .... – trlkly

+1

Sie brauchen Sie nur etwas anderes als 'fill' für Ihr äußeres Array. Ich schlage 'map' oder' Array.from' vor. – Hamms