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.