Jak usunąć element z listy za pomocą lodash?

166

Mam obiekt, który wygląda tak:

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;

Mam lodashzainstalowane w moim wniosku o innych rzeczach. Czy istnieje skuteczny sposób lodashusunięcia wpisu: {"subTopicId":2, "number":32}z objobiektu?

Czy jest na to sposób javascript?

Samantha JT Star
źródło
1
możesz po prostu użyć splice( developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… ), aby usunąć element z listy
z33m
1
Zmieniono tytuł, ponieważ nie można w ten sposób usunąć 4 z tablicy [1,4,5]. Tak, rozumiem, że tablice można zaimplementować na podstawie skrótu / obiektu i prawdopodobnie tak jest, ale istnieje subtelna różnica w tych dwóch. Aby usunąć z tablicy, należy użyć result = _.pull(arr, value) To spowodowałoby usunięcie wszystkich pasujących wartości z listy.
boatcoder

Odpowiedzi:

248

Jak wskazały w komentarzach liryki, bardziej idiomatycznym i lodashowym sposobem na to byłoby użycie _.remove, w ten sposób

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

Oprócz tego możesz przekazać funkcję predykatu, której wynik zostanie użyty do określenia, czy bieżący element ma zostać usunięty, czy nie.

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

Alternatywnie możesz utworzyć nową tablicę, filtrując starą za pomocą _.filteri przypisując ją do tego samego obiektu, w ten sposób

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

Lub

obj.subTopics = _.filter(obj.subTopics, {subTopicId: stToKeep});
na czworo
źródło
3
Powodem, dla którego ta odpowiedź rządzi, jest to, że możesz użyć funkcji predykatu , która jest dokładnie tym, czego szukałem. Usunięcie elementu jest trywialne, jeśli znasz indeks, ale co, jeśli nie znasz indeksu?
random_user_name
3
Warto wspomnieć o _.filterze, jeśli nie chcesz
modyfikować
@cale_b Dziękuję :-) Zaktualizowałem odpowiedź o _.filterwersję.
thefourtheye
7
@thefourtheye _.filter zwraca element, jeśli predykat jest prawdziwy. Twoja implementacja zwróci wszystkie niechciane elementy zamiast tych, które chcesz zachować
Xeltor,
5
@thefourtheye powinieneś użyć _.rejectzamiast _.filtertego samego predykatu. Sprawdź moją odpowiedź, aby uzyskać więcej informacji!
Xeltor
29

Po prostu użyj vanilla JS. Możesz użyć splicedo usunięcia elementu:

obj.subTopics.splice(1, 1);

Próbny

Andy
źródło
3
Is there an efficient way to use _lodash to delete
semirturgay
7
@Andy Masz rację, ale co jeśli indeks nie jest jeszcze znany?
thefourtheye
3
Splice () to najlepsze podejście, jeśli chcesz, aby Twoja tablica została zmutowana. Jeśli użyjesz usuń, zwraca nową tablicę i należy ją ponownie przypisać.
omarjebari
Jeśli chcesz usunąć element z tablicy przez jego indeks w tablicy (oczywiście masz ten indeks, jeśli chcesz wykonać akcję usuwania w ten sposób), to użycie metody łączenia jest najbardziej wydajnym (i łatwym) sposobem zrobić to. Nie trzeba niczego porównywać i czynić kodu bardziej skomplikowanym i podatnym na błędy i błędy ...
TheCuBeMan
26

możesz to zrobić _pull.

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

sprawdź odniesienie

semirturgay
źródło
7
Zgodnie z dokumentacją, do porównań_.pull używa ścisłej równości, tj . === . Dwa różne zwykłe obiekty nigdy nie będą porównywane jako równe przez ===(lub przez ==to). W ten sposób powyższy kod nigdy nie usunie żadnych elementów z tablicy.
Mark Amery,
1
Jednak jest to jedyny, który działa z łańcuchami w tablicy. _.removepo prostu opróżnia tablicę.
Yauheni Prakopchyk,
3
Nadal uważam, że to właściwa odpowiedź. JS .filter usuwa wszystkie pasujące elementy, JS .splice wymaga znajomości indeksu, _.remove iteruje po wszystkich elementach tablicy, przez co jest mniej wydajna. _.pull jest dokładnie tym, czego chcę: _.pull (tablica, itemToRemove).
Judah Gabriel Himango
21

Możesz teraz użyć _.reject, który pozwala filtrować na podstawie tego, czego chcesz się pozbyć, zamiast tego, co musisz zachować.

w przeciwieństwie _.pullalbo _.removeże tylko praca na macierzach, ._rejectpracuje na dowolny Collection

obj.subTopics = _.reject(obj.subTopics, (o) => {
  return o.number >= 32;
});
Xeltor
źródło
2

Znam na to cztery sposoby

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

Pierwszy:

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

Drugi to:

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

W ten sposób tablica zostanie zmutowana.

Trzeci to:

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

Ostatni to:

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

uczę się lodash

Odpowiedz, aby zrobić rekord, abym mógł go później znaleźć.

mqliutie
źródło
Szukałemreject
Sampgun
2

Oprócz odpowiedzi @thefourtheye, używając predykatu zamiast tradycyjnych funkcji anonimowych:

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

LUB

obj.subTopics = _.filter(obj.subTopics, (currentObject) => {
    return currentObject.subTopicId !== stToDelete;
});
Pranav Singh
źródło
1

lodasz i maszynopis

const clearSubTopics = _.filter(obj.subTopics, topic => (!_.isEqual(topic.subTopicId, 2)));
console.log(clearSubTopics);
Uliana Pavelko
źródło
0

Oto prosta funkcja lodash z tablicą i usuwaniem jej z numerem indeksu.

index_tobe_delete = 1

fruit = [{a: "apple"}, {b: "banana"}, {c: "choco"}]
_.filter(fruit, (value, key)=> {
return (key !== index_tobe_delete)
})
Anupam Maurya
źródło