Array.push zurück gedrängt Wert?
Gibt es wesentliche Gründe, warum ändern Array.push()
das Objekt zurückzugeben geschoben, anstatt die Länge des neuen Arrays könnte eine schlechte Idee?
Ich weiß nicht, ob dies wurde bereits vorgeschlagen, oder vorher gefragt; Google-Suche wieder nur eine unzählige Anzahl der Fragen, die im Zusammenhang mit der aktuellen Funktionalität von Array.push()
.
Hier ist eine Beispiel-Implementierung dieser Funktionalität, fühlen Sie sich frei, um es zu korrigieren:
;(function() {
var _push = Array.prototype.push;
Array.prototype.push = function() {
return this[_push.apply(this, arguments) - 1];
}
}());
Du dann in der Lage wäre, so etwas zu tun:
var someArray = [],
value = "hello world";
function someFunction(value, obj) {
obj["someKey"] = value;
}
someFunction(value, someArray.push({}));
Wo someFunction
ändert das Objekt übergeben, als zweiter parameter, zum Beispiel. Nun den Inhalt someArray
sind [{"someKey": "hello world"}]
.
Gibt es irgendwelche Nachteile hat dieser Ansatz?
Array.prototype.push
, nicht Array.push
. Außerdem können Sie immer das element, das Sie gerade geschoben auf das array, wenn Sie es brauchen, mit array[array.length - 1]
oder Sie könnten nur speichern Sie es in einer temporären lokalen variable vor der Verwendung .push()
. Schlechte, schlechte Idee.FYI, Sie brach auch die Semantik von
.push()
denen mehrere Argumente.Danke für den catch. Und ja, ich bin mir bewusst, dass ich die aktuellste Objekt; in der Tat, ich kann es tun, mit ein Einzeiler:
array[array.push(val) - 1]
. Ich denke, diese 'Idee' ist unnötig, aber ich konnte nicht wirklich sehen, warum ohne eine Sicht von außen. Gummi-ducking und all das, nehme ich an. Oh, und Feste Semantik.Auch, wenn Sie möchten, posten Sie Ihren Kommentar als eine Antwort werde ich akzeptieren, dass, seit Sie reagierte, bevor Bergischen. Ansonsten, ich akzeptiere seine Antwort.
wenn die Vorherige Anweisung nicht richtig enden mit einem Semikolon, was soll eine IIFE Aussehen kann, das starten von einem Aufruf einer Funktion und verursachen einen unbeabsichtigten Fehler, oder noch schlimmer, falsche Ausführung. Dies ist mir tatsächlich passiert, wenn die Arbeit auf fremden code, die scheinen zu einem gebrochenen Semikolon-Taste auf Ihrer Tastatur.
InformationsquelleAutor Elliot Bonneville | 2014-04-29
Du musst angemeldet sein, um einen Kommentar abzugeben.
Natürlich gibt es einen: Anderen code erwartet
Array::push
zu Verhalten, wie in der Spezifikation definiert, d.h. für die Rückkehr der neuen Länge. Und andere Entwickler Ihren code unverständlich, wenn Sie nicht neu definieren, vordefinierte Funktionen zu unerwartetem Verhalten.Mindestens wählen Sie einen anderen Namen für die Methode ein.
Äh, was? Yeah, mein zweiter Punkt bereits Streiks 🙂
Jedoch, auch wenn Sie nicht
push
dies nicht rüberbringen, was Sie tun möchten. Die Komposition, die Sie zum Ausdruck bringen sollte, ist "ein Objekt hinzuzufügen, die aus einem Schlüssel und einem Wert zu einem array". Mit einer mehr funktionalen Stil, lassensomeFunction
Rückkehr dieses Objekts, und Sie können schreiben,Sie können davon ausgehen, daß viele Dinge, die Sie beide annehmen und verwenden.
Was meinst du mit "internen code"? Nein, keine integrierte Funktionalität basiert auf dem Wert der
Array.prototype.push
. Auch wenn nichts Tat es, seit ES5.1 solche Dinge, die angegeben sind, beziehen sich auf die builtin_push
Funktion direkt und nicht Referenz überschrieben Eigenschaften.Ah, ok. Vielen Dank für die Einsicht. +1
laut ECMA-262. Ich bezweifle sehr, dass die internen Methoden der integrierten Objekte verwenden würden, öffentliche Schnittstellen ohnehin, Ihr Verhalten ausgedrückt ist, rein in Bezug auf die internen Methoden (
[[Get]]
,[[Put]]
,[[Delete]]
, etc).InformationsquelleAutor Bergi
Nur als historische Anmerkung -- Es war eine ältere version von JavaScript --
JavaScript version 1.2
-- , behandelt eine Reihe von array-Funktionen sehr unterschiedlich.Insbesondere zu dieser Frage
Array.push
hat den Artikel zurück, nicht die Länge des Arrays.Sagte,
1.2
wurde nicht verwendet wurde seit Jahrzehnten -- aber einige sehr alte Verweise vielleicht noch auf dieses Verhalten.http://web.archive.org/web/20010408055419/developer.netscape.com/docs/manuals/communicator/jsguide/js1_2.htm
Keiner, den ich je gehört habe, aber ich rollte mit den Fäusten und ging mit ihm.
1.2
war auf dem Weg aus, wenn ich immer in die Dinge.InformationsquelleAutor Jeremy J Starcher
Siehe meine ausführliche Antwort hier
TLDR;
Sie können den Rückgabewert des mutierten array, wenn Sie stattdessen fügen Sie ein element mit
array.concat[]
.concat
ist eine Art von "hinzufügen" oder "joinen" Sie zwei arrays zusammen. Das ehrfürchtige Sache über diese Methode ist, dass es einen return-Wert der resultierenden array, so kann es sein, angekettet.newArray = oldArray.concat[newItem];
Dies erlaubt Ihnen auch, chain-Funktion zusammen
updatedArray = oldArray.filter((item) => {
item.id !== updatedItem.id).concat[updatedItem]};
Wo
item = {id: someID, value: someUpdatedValue}
Die wichtigste Sache zu beachten ist, dass Sie brauchen, um passieren eine array zu
concat
.So stellen Sie sicher, dass Sie Ihren Wert "geschoben" in einem paar von eckigen Klammern, und du bist gut zu gehen.
Dies wird Ihnen die Funktionalität, die Sie erwarten von
push()
Können Sie die
+
Betreiber auf "add" zwei arrays zusammen, oder durch die übergabe der arrays als Parameter zuconcat()
.Beachten Sie, dass durch die
concat
- Methode, können Sie die Vorteile von "chaining" - Befehle vor und nachconcat
.Array.prototype.push()
- und dies ist bei weitem das (fast) beste Antwort. Die beste Antwort wäretargetArray.concat([newValue]).thenChainMoreStuff...
InformationsquelleAutor SherylHohman
InformationsquelleAutor brillout