it-swarm.com.de

Array.Push () if existiert nicht?

Wie kann ich in ein Array hineinschieben, 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 versucht habe, mit name: "tom" oder text: "tasty" erneut in das Array zu schieben, möchte ich nichts passieren ... aber wenn keine davon vorhanden ist, möchte ich .Push()

Wie kann ich das machen?

176
tarnfeld

Sie können den Array-Prototyp um eine benutzerdefinierte 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; 
});
92
Darin Dimitrov

Bei einem String-Array (aber nicht bei einem Array von Objekten) können Sie prüfen, ob ein Element vorhanden ist, indem Sie .indexOf() aufrufen. Wenn dies nicht der Fall ist, drücken Sie Push 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)

308
Jiří Zahálka

Die Verwendung der Array.findIndex-Funktion ist recht einfach, da eine Funktion als Argument verwendet wird:

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

if (index === -1){
    a.Push({your_object});
}
else console.log("object already exists")
45
ashish yadav

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

var cleanArray = $.unique(clutteredArray);

vielleicht interessieren Sie sich auch für makeArray

Das vorige Beispiel ist am besten zu sagen, dass vor dem Push überprüft wird, ob es vorhanden ist . Ich sehe im Nachhinein auch, dass Sie es als Teil des Prototyps deklarieren können (ich glaube, das ist Class Extension).

Außer ich bin nicht sicher, ob indexOf eine schnellere Route ist als inArray? wahrscheinlich.

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

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

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

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)
19
Ron Royston

Ich weiß, dass dies eine sehr alte Frage ist, 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 den Artikel entfernt - wenn er bereits vorhanden ist, und fügen Sie ihn dann über ein 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önnen Sie die Filterfunktion folgendermaßen anpassen:

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

Falls Sie etwas einfaches benötigen, ohne den Array-Prototyp erweitern zu wollen:

// Example array
var array = [{id: 1}, {id: 2}, {id: 3}];

function pushIfNew(obj) {
  for (var i = 0; i < array.length; i++) {
    if (array[i].id === obj.id) { // modify whatever property you need
      return;
    }
  }
  array.Push(obj);
}
3
docta_faustus

Die Geschwindigkeit ist nicht sicher, aber stringification + indexOf ist ein einfacher Ansatz. Beginnen Sie mit der Umwandlung Ihres Arrays in einen String:

let strMyArray = JSON.stringify(myArray);

Für eine Reihe von Attribut-Wert-Paaren können Sie dann Folgendes verwenden:

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

Ein ganzes Objekt zu finden ist einfacher:

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

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

Update: Ersetzen von indexOf und Trimmen durch jQuery-Alternativen für IE8-Kompatibilität

2
Scott Beeson

Ich habe map und verkleinert, um dies in dem Fall zu tun, in dem Sie nach einer bestimmten Eigenschaft eines Objekts suchen möchten. Dies ist nützlich, da direkte Objektgleichheit häufig fehlschlägt.

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");
}
2
Adrian Smith

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

Hinweis: Alte Browser kennen findIndex nicht, es ist jedoch eine Polyfill verfügbar.

Beispielcode (achten Sie darauf, dass ein neues Objekt in der ursprünglichen Frage nur dann gepusht wird, wenn sich keine seiner Daten in zuvor gepuschten Objekten befindet):

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
1
Simon Hi

Ich würde vorschlagen, dass Sie ein Set verwenden,

Sets erlauben nur eindeutige Einträge, was Ihr Problem automatisch löst.

Mengen können folgendermaßen deklariert werden:

const baz = new Set(["Foo","Bar"])
1
Michael McQuade

Kurzes Beispiel:

if (typeof(arr[key]) === "undefined") {
  arr.Push(key);
}

Dynamisch schieben  

var a = [
  {name:"bull", text: "sour"},
  { name: "tom", text: "tasty" },
  { name: "tom", text: "tasty" }
]

addTimelineItem(item) {
  var index = this.initiateTimeline.findIndex(x => x.name == item.name)
  if (index === -1) {
    this.initiateTimeline.Push(item);
  }else {
    console.log("object already exists")
  }
}
0
Raj Gopal

Dies funktioniert für einen Objektvergleich. In einigen Fällen haben Sie möglicherweise viele Felder, die Sie miteinander vergleichen können ..__ Schleifen Sie einfach das Array und rufen Sie diese Funktion mit einem vorhandenen Element und einem neuen Element auf.

 var objectsEqual = function (object1, object2) {
        if(!object1 || !object2)
            return false;
        var result = true;
        var arrayObj1 = _.keys(object1);
        var currentKey = "";
        for (var i = 0; i < arrayObj1.length; i++) {
            currentKey = arrayObj1[i];
            if (object1[currentKey] !== null && object2[currentKey] !== null)
                if (!_.has(object2, currentKey) ||
                    !_.isEqual(object1[currentKey].toUpperCase(), object2[currentKey].toUpperCase()))
                    return false;
        }
        return result;
    };
0
user3180914

Ich denke, ich bin zu spät, um hier zu antworten, aber das ist es, was ich mir für einen Mail-Manager ausgedacht habe, den ich geschrieben habe. Funktioniert das ist alles was ich brauche.

window.ListManager = [];
$('#add').click(function(){
//Your Functionality
  let data =Math.floor(Math.random() * 5) + 1 
  
  if (window.ListManager.includes(data)){
      console.log("data exists in list")
  }else{
       window.ListManager.Push(data);
  }
  
  
  $('#result').text(window.ListManager);
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<h1>Unique List</h1>

<p id="result"></p>
<button id="add">Add to List</button>
0
TheeCodeDragon