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?

621voto

Jiří Zahálka Punkte 7524

Für ein Array von Strings (aber nicht für ein Array von Objekten) können Sie prüfen, ob ein Element existiert, indem Sie .indexOf() und wenn das nicht der Fall ist, dann einfach drücken. das Element in das Array:

var newItem = "NEW_ITEM_TO_ARRAY";
var array = ["OLD_ITEM_1", "OLD_ITEM_2"];

array.indexOf(newItem) === -1 ? array.push(newItem) : console.log("This item already exists");

console.log(array)

195voto

Ashish Yadav Punkte 2773

Dies ist ganz einfach mit der Funktion Array.findIndex Funktion, die eine Funktion als Argument annimmt:

var arrayObj = [{name:"bull", text: "sour"},
    { name: "tom", text: "tasty" },
    { name: "tom", text: "tasty" }
]
var index = arrayObj.findIndex(x => x.name=="bob"); 
// here you can check specific property for an object whether it exist in your array or not

index === -1 ? arrayObj.push({your_object}) : console.log("object already exists")

131voto

Darin Dimitrov Punkte 990883

Sie können den Array-Prototyp um eine eigene Methode erweitern:

// check if an element exists in array using a comparer function
// comparer : function(currentElement)
Array.prototype.inArray = function(comparer) { 
    for(var i=0; i < this.length; i++) { 
        if(comparer(this[i])) return true; 
    }
    return false; 
}; 

// adds an element to the array if it does not already exist using a comparer 
// function
Array.prototype.pushIfNotExist = function(element, comparer) { 
    if (!this.inArray(comparer)) {
        this.push(element);
    }
}; 

var array = [{ name: "tom", text: "tasty" }];
var element = { name: "tom", text: "tasty" };
array.pushIfNotExist(element, function(e) { 
    return e.name === element.name && e.text === element.text; 
});

51voto

Michael J. Zoidl Punkte 1540

Ich weiß, dies ist eine sehr alte Frage, aber wenn Sie ES6 verwenden, können Sie eine sehr kleine Version verwenden:

[1,2,3].filter(f => f !== 3).concat([3])

Ganz einfach: Fügen Sie zunächst einen Filter hinzu, der das Element entfernt, falls es bereits vorhanden ist, und fügen Sie es dann über eine Verknüpfung hinzu.

Hier ist ein realistischeres Beispiel:

const myArray = ['hello', 'world']
const newArrayItem

myArray.filter(f => f !== newArrayItem).concat([newArrayItem])

Wenn Ihr Array Objekte enthält, können Sie die Filterfunktion wie folgt anpassen:

someArray.filter(f => f.some(s => s.id === myId)).concat([{ id: myId }])

40voto

MistereeDevlord Punkte 882

http://api.jquery.com/jQuery.unique/

var cleanArray = $.unique(clutteredArray);

Sie könnten auch an makeArray interessiert sein

Das vorherige Beispiel ist am besten geeignet, um zu prüfen, ob es existiert, bevor man es verschiebt. Ich sehe im Nachhinein, dass es auch heißt, dass Sie es als Teil des Prototyps deklarieren können (ich schätze, das ist aka Class Extension), also keine große Verbesserung unten.

Außer ich bin nicht sicher, ob indexOf ein schnellerer Weg als inArray ist? wahrscheinlich.

Array.prototype.pushUnique = function (item){
    if(this.indexOf(item) == -1) {
    //if(jQuery.inArray(item, this) == -1) {
        this.push(item);
        return true;
    }
    return false;
}

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