Wie kann ich in ein Array pushen, wenn keiner der Werte vorhanden ist? Hier ist mein Array:
[
{ name: "tom", text: "tasty" },
{ name: "tom", text: "tasty" },
{ name: "tom", text: "tasty" },
{ name: "tom", text: "tasty" },
{ name: "tom", text: "tasty" }
]
Wenn ich versucht habe, mit oder name: "tom"
oder erneut in das Array zu pushen text: "tasty"
, möchte ich nicht, dass etwas passiert ... aber wenn keines davon vorhanden ist, möchte ich, dass es passiert.push()
Wie kann ich das machen?
javascript
arrays
json
push
not-exists
Tarnfeld
quelle
quelle
Antworten:
Sie können den Array-Prototyp mit einer benutzerdefinierten Methode erweitern:
quelle
Array.findIndex()
ist eine integrierte JS-Funktion, die dasselbe erreicht wie Ihr Code.Für ein Array von Zeichenfolgen (aber nicht für ein Array von Objekten) können Sie durch Aufrufen überprüfen, ob ein Element vorhanden ist,
.indexOf()
und ob dies nicht der Fall ist , wird das Element in das Array verschoben:quelle
if (a.indexOf({ name: "tom", text: "tasty" })!=-1) a.push({ name: "tom", text: "tasty" })
zweimal. Es wird zweimal ein "ähnliches" Objekt hinzugefügt.Es ist ziemlich einfach, die
Array.findIndex
Funktion zu verwenden, die eine Funktion als Argument verwendet:quelle
http://api.jquery.com/jQuery.unique/
Vielleicht interessiert Sie auch makeArray
Im vorherigen Beispiel sollten Sie vor dem Drücken überprüfen, ob es vorhanden ist. Ich sehe im Nachhinein auch, dass Sie es als Teil des Prototyps deklarieren können (ich denke, das ist auch als Klassenerweiterung bekannt), also keine große Verbesserung unten.
Außer ich bin mir nicht sicher, ob indexOf eine schnellere Route ist als inArray? wahrscheinlich.
quelle
Note that this only works on arrays of DOM elements, not strings or numbers.
Außerdem funktioniert indexOf in IE8 nicht :(Verwenden Sie genau aus diesen Gründen eine js-Bibliothek wie underscore.js . Verwendung: Vereinigung: Berechnet die Vereinigung der übergebenen Arrays: Die Liste der eindeutigen Elemente in der Reihenfolge, die in einem oder mehreren der Arrays vorhanden sind.
quelle
So was?
Mit Objekt
quelle
array.find
ist eine schlechte Idee, weil es das gesamte Array durchsucht. Verwenden SiefindIndex
diese Option , die nur bis zum ersten Auftreten sucht.Ich weiß, dass dies eine sehr alte Frage ist, aber wenn Sie ES6 verwenden, können Sie eine sehr kleine Version verwenden:
Sehr einfach, fügen Sie zuerst einen Filter hinzu, der das Element entfernt - falls es bereits vorhanden ist, und fügen Sie es dann über einen Concat hinzu.
Hier ist ein realistischeres Beispiel:
Wenn Ihr Array Objekte enthält, können Sie die Filterfunktion folgendermaßen anpassen:
quelle
Dynamisch drücken
In einfacher Methode
Wenn das Array nur primitive Typen / einfaches Array enthält
quelle
Ich würde vorschlagen, dass Sie ein Set verwenden ,
Sets erlauben nur eindeutige Einträge, wodurch Ihr Problem automatisch gelöst wird.
Sets können wie folgt deklariert werden:
quelle
Array.push
, alsoSet.add
ist das Äquivalent dazu.Einfacher Code: Wenn 'indexOf' '-1' zurückgibt, bedeutet dies, dass sich das Element nicht im Array befindet, und die Bedingung '=== -1' ruft true / false ab.
Der Operator '&&' bedeutet 'und'. Wenn also die erste Bedingung erfüllt ist, verschieben wir sie in das Array.
quelle
Ich bin mir nicht sicher über die Geschwindigkeit, aber
stringification
+indexOf
ist ein einfacher Ansatz. Beginnen Sie damit, Ihr Array in einen String umzuwandeln:Dann können Sie für eine Reihe von Attribut-Wert-Paaren Folgendes verwenden:
Das Finden eines ganzen Objekts ist einfacher:
quelle
Falls Sie etwas Einfaches benötigen, ohne den Array-Prototyp erweitern zu wollen:
quelle
Für den Fall, dass jemand weniger komplizierte Anforderungen hat, hier meine Anpassung der Antwort für ein einfaches String-Array:
Update: Ersetzt indexOf und trimmt durch jQuery-Alternativen für die IE8-Kompatibilität
quelle
Ich habe Map und Reduce verwendet, um dies zu tun, wenn Sie nach einer bestimmten Eigenschaft eines Objekts suchen möchten. Dies ist nützlich, da die direkte Objektgleichheit häufig fehlschlägt.
quelle
Kurzes Beispiel:
quelle
a ist das Array von Objekten, die Sie haben
quelle
Sie können die findIndex-Methode mit einer Rückruffunktion und ihrem "this" -Parameter verwenden.
Hinweis: Alte Browser kennen findIndex nicht, aber eine Polyfüllung ist verfügbar.
Beispielcode (achten Sie darauf, dass in der ursprünglichen Frage ein neues Objekt nur dann gepusht wird, wenn sich keine seiner Daten in zuvor geposteten Objekten befindet):
quelle
Ich denke, ich bin zu spät, um hier zu antworten, aber das ist es, was ich mir schließlich für einen Mail-Manager ausgedacht habe, den ich geschrieben habe. Funktioniert das ist alles was ich brauche.
quelle
Dies funktioniert für einen Objektvergleich. In einigen Fällen müssen Sie möglicherweise viele Felder vergleichen. Schleifen Sie einfach das Array und rufen Sie diese Funktion mit vorhandenen und neuen Elementen auf.
quelle
Hier haben Sie eine Möglichkeit, dies in einer Zeile für zwei Arrays zu tun:
quelle
Sie können jQuery grep verwenden und pushen, wenn keine Ergebnisse erzielt werden: http://api.jquery.com/jQuery.grep/
Es ist im Grunde die gleiche Lösung wie bei der "Erweiterung des Prototyps" -Lösung, jedoch ohne den Prototyp zu erweitern (oder zu verschmutzen).
quelle
Sie können das Array mit foreach überprüfen und dann das Element einfügen, falls vorhanden. Andernfalls fügen Sie ein neues Element hinzu ...
Beispiel newItemValue & submitFields sind Schlüssel-Wert-Paare
quelle