408 Stimmen

Array.push() wenn nicht vorhanden?

Wie kann ich in ein Array schieben, wenn keine Werte vorhanden sind? 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 versuchte, erneut in das Array zu schieben, entweder mit name: "tom" o text: "tasty" Ich will nicht, dass irgendetwas passiert... aber wenn keines von beidem da ist, dann will ich, dass es passiert. .push()

Wie kann ich das tun?

15voto

Augusto Peres Punkte 161

Meine Wahl war die Verwendung von .includes() Erweiterung des Array.prototype wie von @Darrin Dimitrov vorgeschlagen:

Array.prototype.pushIfNotIncluded = function (element) {
    if (!this.includes(element)) {
      this.push(element);
    }
}

Ich erinnere nur daran, dass includes stammt aus es6 und funktioniert nicht im IE: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/includes

4voto

THE JOATMON Punkte 16589

Für den Fall, dass jemand weniger komplizierte Anforderungen hat, hier ist meine Anpassung der Antwort für ein einfaches String-Array:

Array.prototype.pushIfNotExist = function(val) {
    if (typeof(val) == 'undefined' || val == '') { return; }
    val = $.trim(val);
    if ($.inArray(val, this) == -1) {
        this.push(val);
    }
};

Aktualisierung: indexOf und trim wurden durch jQuery-Alternativen für IE8-Kompatibilität ersetzt

4voto

Entfernen von Duplikaten nach dem Verschieben

Wenn Sie bereits ein Array mit Duplikaten haben, wandeln Sie das Array mit Objekten in ein Array mit Strings um und verwenden dann die Set() Funktion, um Duplikate zu eliminieren:

let arr_obj = [
    { name: "tom", text: "tasty" }, 
    { name: "tom", text: "tasty" }
]

let arr_str = arr_obj.map(JSON.stringify)

let arr_unique = [...new Set(arr_str)].map(JSON.parse) 

Prüfen vor dem Schieben

Wenn Sie bisher keine Duplikate haben und vor dem Schieben eines neuen Elements auf Duplikate prüfen wollen:

let arr_obj = [
    { name: "tom", text: "tasty" },
    { name: "tim", text: "tusty" }
]

let new_obj = { name: "tom", text: "tasty" }

let arr_str = arr_obj.map(JSON.stringify)

!arr_str.includes(JSON.stringify(new_obj)) && arr_obj.push(new_obj)

3voto

moshefnord Punkte 133

Bei der Geschwindigkeit bin ich mir nicht sicher, aber stringification + indexOf ist ein einfacher Ansatz. Beginnen Sie damit, Ihr Array in eine Zeichenkette zu verwandeln:

let strMyArray = JSON.stringify(myArray);

Dann können Sie für eine Reihe von Attribut-Werte-Paaren verwenden:

if (strMyArray.indexOf('"name":"tom"') === -1 && strMyArray.indexOf('"text":"tasty"') === -1) {
   myArray.push({ name: "tom", text: "tasty" });
}

Die Suche nach einem ganzen Objekt ist einfacher:

if (strMyArray.indexOf(JSON.stringify(objAddMe) === -1) { 
   myArray.push(objAddMe);
}

3voto

Simon Hi Punkte 2658

Sie können die findIndex-Methode mit einer Callback-Funktion und ihrem "this"-Parameter verwenden.

Hinweis: Alte Browser kennen findIndex nicht, aber ein Polyfill ist verfügbar.

Beispielcode (beachten Sie, dass in der ursprünglichen Frage ein neues Objekt nur dann gepusht wird, wenn keine seiner Daten in zuvor gepushten Objekten enthalten sind):

var a=[{name:"tom", text:"tasty"}], b;
var magic=function(e) {
    return ((e.name == this.name) || (e.text == this.text));
};

b={name:"tom", text:"tasty"};
if (a.findIndex(magic,b) == -1)
    a.push(b); // nothing done
b={name:"tom", text:"ugly"};
if (a.findIndex(magic,b) == -1)
    a.push(b); // nothing done
b={name:"bob", text:"tasty"};
if (a.findIndex(magic,b) == -1)
    a.push(b); // nothing done
b={name:"bob", text:"ugly"};
if (a.findIndex(magic,b) == -1)
    a.push(b); // b is pushed into a

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X