[Javascript] Array.push () wenn nicht existiert?



Answers

Für ein Array von Strings (aber nicht für ein Array von Objekten) können Sie durch Aufrufen von .indexOf() überprüfen, ob ein Element vorhanden ist und es dann nicht einfach in das Array schieben :

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)

Question

Wie kann ich in ein Array pushen, wenn keine Werte existieren? 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 wieder in das Array mit dem name: "tom" oder dem text: "tasty" drücken wollte, wollte ich nicht, dass etwas passierte ... aber wenn keiner von beiden da ist, dann will ich, dass es .push()

Wie kann ich das machen?




Falls jemand weniger komplizierte Anforderungen hat, hier ist meine Adaption 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);
    }
};

Update: Ersetzt IndexOf und Trim mit jQuery Alternativen für IE8-Kompatibilität




Ich habe map und reduce verwendet, um das zu tun, wenn Sie nach der spezifischen Eigenschaft eines Objekts suchen wollen.

var newItem = {'unique_id': 123};
var searchList = [{'unique_id' : 123}, {'unique_id' : 456}];

hasDuplicate = searchList
   .map(function(e){return e.unique_id== newItem.unique_id})
   .reduce(function(pre, cur) {return pre || cur});

if (hasDuplicate) {
   searchList.push(newItem);
} else {
   console.log("Duplicate Item");
}



Verwenden Sie aus diesen Gründen genau eine js-Bibliothek wie underscore.js . Verwenden Sie: union: Berechnet die Union der übergebenen Arrays: die Liste der eindeutigen Elemente in der Reihenfolge, die in einem oder mehreren der Arrays vorhanden sind.

_.union([1, 2, 3], [101, 2, 1, 10], [2, 1]);
=> [1, 2, 3, 101, 10]



Sie können das Array mit foreach überprüfen und dann das Objekt, wenn es existiert, hinzufügen, sonst fügen Sie neues Element hinzu ...

sample newItemValue & submitFields sind Schlüssel-, Wert-Paare

> //submitFields existing array
>      angular.forEach(submitFields, function(item) {
>                   index++; //newItemValue new key,value to check
>                     if (newItemValue == item.value) {
>                       submitFields.splice(index-1,1);
>                         
>                     } });

                submitFields.push({"field":field,"value":value});



So was?

var item = "Hello World";
var array = [];
if (array.indexOf(item) === -1) array.push(item);

Mit Objekt

var item = {name: "tom", text: "tasty"}
var array = [{}]
if (!array.find(o => o.name === 'tom' && o.text === 'tasty'))
    array.push(item)



Ich weiß, das 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 zuerst einen Filter hinzu, der den Artikel entfernt - wenn er bereits existiert, und fügen Sie ihn dann über einen Concat 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önnten Sie die Filterfunktion wie folgt anpassen:

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



Links