Javascript: .push ist nicht eine Funktion
Ich habe ein problem mit meinem code:
var arrays = [[1, 2, 3], [4, 5], [6]];
console.log(reduce(arrays,function(array,b){
return array.push(b);
}));
function reduce(array,combine){
var current = [];
for(var i = 0;i<array.length;i += 1){
current = combine(current,array[i]);
}
return current;
}
console.log(reduce([1, 2, 3, 4], function(array, b) {
return array.push(b);
}));
//→ [1, 2, 3, 4, 5, 6]
Bekomme ich diesen Fehler:
TypeError: array.push is not a function (line 3)
Soweit ich das verstanden habe, ist dies, weil es die Behandlung der array-argument als etwas anderes als ein array. Aber ich dachte, ich fütterte es die variable "current", das ist ein array. Kann jemand das problem erklären? Danke.
- Yeah, gerade mitbekommen, dass. Danke.
- warum nimmst du nicht das built-in [].reduce() ?
- Ich vermute, er ist mit diesem als eine übung, um zu lernen, wie zu schreiben higher-level-Funktionen.
array.push
gibt den nächsten verfügbarenindex
, und Sie können nichtpush
auf Nummer- Sie erkennen, können Sie etwas wie das hier tun:
var flattened = [].concat.apply([],arrays)
das gleiche Ergebnis zu erhalten? - Sie haben alle aus dieser Anmeldung, aber das nützlichste Ort gewesen wäre, habe
console.log(array)
im ersten reduce () - Aufruf, wie diese variable und die .push() gegen Sie ist, wo Sie immer diese Fehlermeldung.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Array.push
nicht ein array zurückgeben. Es gibt die neue Länge des Arrays hieß es weiter.So, Ihr
return array.push(b);
gibt einint
. Int übergeben bekommt zurück, alsarray
... das ist kein array, so dass es nicht einen.push()
Methode.Müssen Sie tun:
[b, ...array]
Hier das problem, dass
array.push(b)
gibt die neue Länge desarray
. Also nach dem Aufrufcombine(current, array[i])
zum ersten mal, die Länge des array wird zurückgegeben werden und diecurrent
wird eininteger
, und dacurrent
ist das übergebencombine(current, array[i])
in der nächsten iteration, JavaScript wirft dieTypeError
. Ihre Umsetzung fürcombine(current, array[i]
sollte wie folgt Aussehen:Gibt nur das Array, siehe unten:
http://jsfiddle.net/0en82r7t/1/
Weiß ich auch, das ist nur ein test, aber in der Zukunft und in der realen app-Entwicklung nicht name eines
Array
array. Verwenden Sie Ausführlicher und klar benennen, Beispiele: numGroupArray, datesArray, timeArray, tagsArray...array
ist nur eine persönliche Präferenz.Ich verstehe nicht, was die Funktion zu reduzieren ist zu tun, aber das problem ist, dass Array.der Prototyp.push-gibt die Länge des Arrays.
Daher, anstelle von re-Einstellung der aktuellen jede iteration der Schleife, einfach nur die Funktion aufrufen, da
.push()
ändert das array in place.Sieht aus wie es ist ein problem in Ihrer Implementierung:
Was sind Sie wieder, die von dieser Funktion ist nicht ein array.
gibt die Länge des array nach der Ausführung der push.
Also, sollten Sie ändern Ihre Funktion:
Dies könnte den trick tun. Goodluck!
ES6 Lösung :