Rimuovere un elemento dall'array utilizzando UnderscoreJS


137

Di 'che ho questo codice

var arr = [{id: 1, name: 'a'}, {id: 2, name: 'b'}, {id: 3, name: 'c'}];

e voglio rimuovere l'elemento con id = 3 dall'array. C'è un modo per farlo senza giunture? Può qualcosa usare un trattino basso o qualcosa del genere?

Grazie!


Se non si desidera creare un nuovo array, la giunzione è l'unica scelta. Scommetto che il trattino basso lo usa anche (internamente, se esiste un tale metodo).
Felix Kling

6
Cosa c'è di sbagliato nello splicing?
Šime Vidas,

Hai controllato il riferimento del trattino basso?
Šime Vidas,

Semplicemente usando JavaScript, questo è un duplicato di rimuovere oggetti dall'array per proprietà dell'oggetto .
Felix Kling,

5
bene non è duplicato in quanto ha il tag per underscore.js
Garis M Suero,

Risposte:


279

Semplicemente usando JavaScript, è già stata data una risposta: rimuovi oggetti dall'array per proprietà dell'oggetto .

Utilizzando underscore.js, puoi combinare .findWherecon .without:

var arr = [{
  id: 1,
  name: 'a'
}, {
  id: 2,
  name: 'b'
}, {
  id: 3,
  name: 'c'
}];

//substract third
arr = _.without(arr, _.findWhere(arr, {
  id: 3
}));
console.log(arr);
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>

Tuttavia, poiché in questo caso si sta creando un nuovo array, è possibile semplicemente utilizzare _.filterla Array.prototype.filterfunzione nativa (proprio come mostrato nell'altra domanda). Quindi si eseguirà l'iterazione su array una sola volta anziché potenzialmente due volte come qui.

Se si desidera modificare l'array sul posto , è necessario utilizzare .splice. Ciò è mostrato anche nell'altra domanda e undescore non sembra fornire alcuna funzione utile per questo.


1
Sì, questo funziona perfettamente, ho esaminato la documentazione del trattino basso ma non ho capito bene come estrarlo senza. Grazie!
climboid,

10
_.Reject o _.filter () non sarebbero molto più efficienti qui? Si finirebbe con due iterazioni dell'elenco solo per estrarre un elemento.
Rick Strahl,

1
Questo potrebbe essere un duplicato ma questa è la risposta migliore.
Michael J. Calkins,

2
@RickStrahl Hai ragione. _.rejectsembra una selezione migliore qui.
Tarik,

1
@lukaserat per far apparire l'ultimo elemento, usa arr.pop()...
Emile Bergeron,

96

Puoi usare Underscore .filter

    var arr = [{
      id: 1,
      name: 'a'
    }, {
      id: 2,
      name: 'b'
    }, {
      id: 3,
      name: 'c'
    }];

    var filtered = _(arr).filter(function(item) {
         return item.id !== 3
    });

Può anche essere scritto come:

var filtered = arr.filter(function(item) {
    return item.id !== 3
});

var filtered = _.filter(arr, function(item) {
    return item.id !== 3
});

Controlla il violino

Puoi anche usare .reject


Penso che volevi dire: var filtered = _.filter (arr, function (item) {return item.id! == 3});
martedì

2
@tbh__ _()creerà un wrapper attorno alla raccolta che ti permetterà di invocare i metodi di sottolineatura.
Sushanth -

Uso il carattere di sottolineatura da anni, non l'ho mai saputo. Grazie
martedì


16

Underscore ha un metodo _without () perfetto per rimuovere un elemento da un array, specialmente se hai l'oggetto da rimuovere.

Restituisce una copia dell'array con tutte le istanze dei valori rimossi.

_.without(["bob", "sam", "fred"], "sam");

=> ["bob", "fred"]

Funziona anche con oggetti più complessi.

var bob = { Name: "Bob", Age: 35 };
var sam = { Name: "Sam", Age: 19 };
var fred = { Name: "Fred", Age: 50 };

var people = [bob, sam, fred]

_.without(people, sam);

=> [{ Name: "Bob", Age: 35 }, { Name: "Fred", Age: 50 }];

Se non hai l'elemento da rimuovere, solo una sua proprietà, puoi usarlo _.findWheree poi _.without.


2
Nota: questo funziona solo perché stai passando l'oggetto sam senza. Se invece passi { Name: "Sam", Age: 19 }a senza, anziché alla variabile sam, non funziona più. Fiddle
Adam

5

Prestare attenzione se si filtrano le stringhe e si cercano filtri insensibili alle maiuscole. _.without () fa distinzione tra maiuscole e minuscole. Puoi anche usare _.reject () come mostrato di seguito.

var arr = ["test","test1","test2"];

var filtered = _.filter(arr, function(arrItem) {
    return arrItem.toLowerCase() !== "TEST".toLowerCase();
});
console.log(filtered);
// ["test1", "test2"]

var filtered1 = _.without(arr,"TEST");
console.log(filtered1);
// ["test", "test1", "test2"]

var filtered2 = _.reject(arr, function(arrItem){ 
    return arrItem.toLowerCase() === "TEST".toLowerCase();
});
console.log(filtered2);
// ["test1", "test2"]

4

Altre risposte creano una nuova copia dell'array, se si desidera modificare l'array in atto è possibile utilizzare:

arr.splice(_.findIndex(arr, { id: 3 }), 1);

Ma ciò presuppone che l'elemento verrà sempre trovato all'interno dell'array (perché se non viene trovato rimuoverà comunque l'ultimo elemento). Per sicurezza puoi usare:

var index = _.findIndex(arr, { id: 3 });
if (index > -1) {
    arr.splice(index, 1);
}

2

o un altro modo pratico:

_.omit(arr, _.findWhere(arr, {id: 3}));

i miei 2 centesimi


1
ometti funziona objecte restituisce un object. quindi non molto buono per lavorare con Arraysdove potremmo aspettarci di ottenere una arrayschiena dopo aver rimosso un elemento.
ScrapCode

1
Quindi, _.senza è il su che stai guardando: _.without([1, 2, 1, 0, 3, 1, 4], 0, 1); => [2, 3, 4]
Nadeem,

2

Usa possono usare pianura JavaScript 's Array#filtermetodo come questo:

var arr = [{id:1,name:'a'},{id:2,name:'b'},{id:3,name:'c'}];

var filteredArr = arr.filter(obj => obj.id != 3);

console.log(filteredArr);

Oppure, utilizzare Array#reducee Array#concatmetodi come questo:

var arr = [{id:1,name:'a'},{id:2,name:'b'},{id:3,name:'c'}];

var reducedArr = arr.reduce((accumulator, currObj) => {
  return (currObj.id != 3) ? accumulator.concat(currObj) : accumulator;
}, []);

console.log(reducedArr);

NOTA:

  • Entrambi sono puro approccio funzionale ( cioè non modificano l'array esistente).
  • No, in questo approccio è necessaria una libreria esterna (è sufficiente Vanilla JavaScript).

0

Ho provato questo metodo

_.filter(data, function(d) { return d.name != 'a' });

Potrebbero esserci metodi migliori come le soluzioni sopra fornite dagli utenti


0

Utilizzando underscore.js

var arr = [{id:1,name:'a'},{id:2,name:'b'},{id:3,name:'c'}];

var resultArr = _.reject(arr,{id:3});

console.log(resultArr);

Il risultato sarà: [{id:1name:'a'},{id:2,name:'c'}]


-1

È possibile utilizzare il metodo di rifiuto di Underscore, di seguito verrà restituito un nuovo array che non avrà array con una corrispondenza particolare

arr = _.reject(arr, function(objArr){ return objArr.id == 3; });
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.