Come posso rimuovere un elemento da un elenco, con lodash?


166

Ho un oggetto che assomiglia a questo:

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;

Ho lodashinstallato nella mia applicazione per altre cose. C'è un modo efficiente di usare lodashper eliminare la voce: {"subTopicId":2, "number":32}dalla objoggetto?

O c'è un modo javascript per farlo?


1
puoi semplicemente usare splice( developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… ) per rimuovere l'elemento da un elenco
z33m

1
Modificato il titolo perché la rimozione di 4 da un array [1,4,5] non può essere eseguita in questo modo. Sì, capisco che le matrici possono essere implementate dall'hash / oggetto e probabilmente lo sono, ma c'è una sottile differenza in questi due. Per rimuovere da un array che useresti result = _.pull(arr, value) Questo rimuoverà tutti i valori corrispondenti dalla lista.
Boatcoder

Risposte:


248

Come i lyyon hanno sottolineato nei commenti, un modo più idiomatico e sfacciato di farlo sarebbe usare _.remove, come questo

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

Oltre a ciò, è possibile passare una funzione predicato il cui risultato verrà utilizzato per determinare se l'elemento corrente deve essere rimosso o meno.

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

In alternativa, è possibile creare un nuovo array filtrando quello vecchio con _.filtere assegnandolo allo stesso oggetto, in questo modo

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

O

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

3
Il motivo per cui questa risposta oscilla è perché puoi usare una funzione predicata , che è esattamente quello che stavo cercando. Rimuovere un elemento è banale se conosci l'indice, ma che ne dici di quando non conosci l'indice?
random_user_name

3
Potrebbe valere la pena menzionare _.filter se non si desidera modificare l'array originale ....
random_user_name

@cale_b Grazie :-) Aggiornato la risposta con la _.filterversione.
thefourtheye,

7
@thefourtheye _.filter restituisce un elemento se il predicato è vero. L'implementazione restituirà tutti gli elementi indesiderati anziché quelli che desideri conservare
Xeltor,

5
@thefourtheye dovresti usare _.rejectinvece di _.filterusare lo stesso predicato. Controlla la mia risposta per maggiori dettagli!
Xeltor,

29

Basta usare la vaniglia JS. Puoi usare spliceper rimuovere l'elemento:

obj.subTopics.splice(1, 1);

dimostrazione


3
l'utente chiedeIs there an efficient way to use _lodash to delete
semirturgay

7
@Andy Hai ragione, ma cosa succede se l'indice non è già noto?
thefourtheye

3
splice () è l'approccio migliore se si desidera che il proprio array sia mutato. Se si utilizza Rimuovi, restituisce il nuovo array e questo deve essere riassegnato.
omarjebari,

Se desideri rimuovere un elemento da un array tramite il suo indice nell'array (ovviamente, hai questo indice se vuoi eseguire l'azione di rimozione in questo modo), usare il metodo splice è il modo più efficiente (e facile) per farlo. Non c'è bisogno di confrontare nulla e rendere il codice più complicato e vulnerabile per bug ed errori ...
TheCuBeMan

26

puoi farlo con _pull.

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

controlla il riferimento


7
Secondo i documenti, _.pullutilizza una rigorosa uguaglianza per i confronti, ovvero === . Due diversi oggetti semplici non verranno mai confrontati come uguali per ===(o ==per quella materia). Pertanto il codice sopra non rimuoverà mai alcun elemento dall'array.
Mark Amery,

1
Tuttavia, questo è l'unico che funziona con le stringhe nell'array. _.removesvuota l'array.
Yauheni Prakopchyk,

3
Penso ancora che questa sia la risposta giusta. JS .filter rimuove tutti gli elementi corrispondenti, JS .splice richiede che conosca l'indice, _.remove scorre su tutti gli elementi dell'array e quindi è meno efficiente. _.pull è esattamente quello che voglio: _.pull (array, itemToRemove).
Giuda Gabriele Himango,

21

Ora puoi utilizzare _.reject che ti consente di filtrare in base a ciò di cui hai bisogno per sbarazzarti, anziché a ciò che devi conservare.

diversamente _.pullo _.removeche funziona solo su array, ._rejectfunziona su qualsiasi Collection

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

2

Ci sono quattro modi per farlo come so

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

Il primo:

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

Il secondo è:

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

In questo modo l'array verrà mutato.

Il terzo è:

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

L'ultimo è:

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

sto imparando lodash

Rispondi per fare un disco, in modo da poterlo trovare in seguito.


Stavo cercandoreject
Sampgun

2

In aggiunta alla risposta @thefourtheye, usando predicato invece delle tradizionali funzioni anonime:

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

O

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

1

lodash e dattiloscritto

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

0

Ecco la semplice funzione lodash con array e la sua cancellazione con il numero indice.

index_tobe_delete = 1

fruit = [{a: "apple"}, {b: "banana"}, {c: "choco"}]
_.filter(fruit, (value, key)=> {
return (key !== index_tobe_delete)
})
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.