Wie kann ich mit lodash ein Element aus einer Liste entfernen?


165

Ich habe ein Objekt, das so aussieht:

var obj = {
    "objectiveDetailId": 285,
    "objectiveId": 29,
    "number": 1,
    "text": "x",
    "subTopics": [{
        "subTopicId": 1,
        "number": 1
    }, {
        "subTopicId": 2,
        "number": 32
    }, {
        "subTopicId": 3,
        "number": 22
    }]
}
var stToDelete = 2;

Ich habe lodashin meiner Anwendung für andere Dinge installiert. Gibt es eine effiziente Möglichkeit, lodashden Eintrag zu löschen: {"subTopicId":2, "number":32}aus dem objObjekt?

Oder gibt es eine Javascript-Möglichkeit, dies zu tun?


1
Sie können einfach splice( developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… ) verwenden, um ein Element aus einer Liste zu entfernen
z33m

1
Der Titel wurde geändert, da das Entfernen von 4 aus einem Array [1,4,5] auf diese Weise nicht möglich ist. Ja, ich verstehe, dass Arrays aus dem Hash / Objekt implementiert werden können und wahrscheinlich auch sind, aber es gibt einen subtilen Unterschied zwischen diesen beiden. Zum Entfernen aus einem Array, das Sie verwenden würden result = _.pull(arr, value) Dies würde alle übereinstimmenden Werte aus der Liste entfernen.
Bootscodierer

Antworten:


247

Wie lyyons in den Kommentaren darauf hingewiesen, mehr idiomatische und lodashy Weg , dies zu tun zu verwenden , wäre _.removewie diese,

_.remove(obj.subTopics, {
    subTopicId: stToDelete
});

Außerdem können Sie eine Prädikatfunktion übergeben, deren Ergebnis verwendet wird, um zu bestimmen, ob das aktuelle Element entfernt werden muss oder nicht.

_.remove(obj.subTopics, function(currentObject) {
    return currentObject.subTopicId === stToDelete;
});

Alternativ können Sie ein neues Array erstellen, indem Sie das alte mit filtern _.filterund es wie folgt demselben Objekt zuweisen

obj.subTopics = _.filter(obj.subTopics, function(currentObject) {
    return currentObject.subTopicId !== stToDelete;
});

Oder

obj.subTopics = _.filter(obj.subTopics, {subTopicId: stToKeep});

3
Der Grund, warum diese Antwort rockt, ist, dass Sie eine Prädikatfunktion verwenden können , genau das, wonach ich gesucht habe. Das Entfernen eines Elements ist trivial, wenn Sie den Index kennen, aber was ist, wenn Sie den Index nicht kennen?
random_user_name

3
Könnte erwähnenswert sein _.filter, wenn Sie das ursprüngliche Array nicht mutieren möchten ....
random_user_name

@cale_b Danke :-) Die Antwort wurde mit der _.filterVersion aktualisiert .
thefourtheye

7
@thefourtheye gibt _.filter ein Element zurück, wenn das Prädikat wahr ist. Ihre Implementierung wird alle unerwünschten Elemente anstelle der Elemente zurückgeben, die Sie behalten möchten
Xeltor

5
@thefourtheye sollten Sie verwenden, _.rejectanstatt _.filterdas gleiche Prädikat zu verwenden. Überprüfen Sie meine Antwort für weitere Details!
Xeltor

29

Verwenden Sie einfach Vanille JS. Sie können splicedas Element verwenden , um Folgendes zu entfernen:

obj.subTopics.splice(1, 1);

Demo


3
Der Benutzer fragtIs there an efficient way to use _lodash to delete
Semirturgay

7
@Andy Sie haben Recht, aber was ist, wenn der Index noch nicht bekannt ist?
thefourtheye

3
splice () ist der beste Ansatz, wenn Ihr Array mutiert werden soll. Wenn Sie remove verwenden, wird das neue Array zurückgegeben und dieses muss neu zugewiesen werden.
Omarjebari

Wenn Sie ein Element anhand seines Index im Array aus einem Array entfernen möchten (offensichtlich haben Sie diesen Index, wenn Sie die Entfernungsaktion auf diese Weise ausführen möchten), ist die Verwendung der Spleißmethode die effizienteste (und einfachste) Methode es zu tun. Sie müssen nichts vergleichen und den Code komplizierter und anfälliger für Fehler machen ...
TheCuBeMan

26

du kannst es mit machen _pull.

_.pull(obj["subTopics"] , {"subTopicId":2, "number":32});

Überprüfen Sie die Referenz


7
_.pullVerwendet gemäß den Dokumenten strikte Gleichheit für Vergleiche, dh === . Zwei verschiedene einfache Objekte werden niemals als gleich ===(oder auch nicht) verglichen ==. Daher entfernt Ihr Code oben niemals Elemente aus dem Array.
Mark Amery

1
Dies ist jedoch die einzige, die mit Zeichenfolgen im Array arbeitet. _.removeLeert einfach das Array.
Yauheni Prakopchyk

3
Ich denke immer noch, dass dies die richtige Antwort ist. JS .filter entfernt alle übereinstimmenden Elemente. JS .splice setzt voraus, dass ich den Index kenne. _.Remove iteriert über alle Elemente des Arrays und ist daher weniger effizient. _.pull ist genau das, was ich will: _.pull (Array, itemToRemove).
Judah Gabriel Himango

21

Sie können jetzt _.reject verwenden , mit dem Sie nach dem filtern können, was Sie entfernen müssen, anstatt nach dem, was Sie behalten müssen.

im Gegensatz zu _.pulloder _.removedass nur auf Arrays arbeiten, ._rejectfunktioniert auf jedem Collection

obj.subTopics = _.reject(obj.subTopics, (o) => {
  return o.number >= 32;
});

2

Wie ich weiß, gibt es vier Möglichkeiten, dies zu tun

const array = [{id:1,name:'Jim'},{id:2,name:'Parker'}];
const toDelete = 1;

Der Erste:

_.reject(array, {id:toDelete})

Der zweite ist:

_.remove(array, {id:toDelete})

Auf diese Weise wird das Array mutiert.

Der dritte ist:

_.differenceBy(array,[{id:toDelete}],'id')
// If you can get remove item 
// _.differenceWith(array,[removeItem])

Der letzte ist:

_.filter(array,({id})=>id!==toDelete)

Ich lerne lodash

Antworte, um eine Aufzeichnung zu machen, damit ich sie später finden kann.


Ich suchtereject
Sampgun

2

Zusätzlich zur @ thefourtheye-Antwort wird Prädikat anstelle traditioneller anonymer Funktionen verwendet:

  _.remove(obj.subTopics, (currentObject) => {
        return currentObject.subTopicId === stToDelete;
    });

ODER

obj.subTopics = _.filter(obj.subTopics, (currentObject) => {
    return currentObject.subTopicId !== stToDelete;
});

1

lodash und maschinenschrift

const clearSubTopics = _.filter(obj.subTopics, topic => (!_.isEqual(topic.subTopicId, 2)));
console.log(clearSubTopics);

0

Hier ist die einfache lodash-Funktion mit Array und Löschen mit der Indexnummer.

index_tobe_delete = 1

fruit = [{a: "apple"}, {b: "banana"}, {c: "choco"}]
_.filter(fruit, (value, key)=> {
return (key !== index_tobe_delete)
})
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.