Remover um item da matriz usando UnderscoreJS


137

Digamos que eu tenho esse código

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

e quero remover o item com id = 3 da matriz. Existe uma maneira de fazer isso sem emendar? Pode algo usando sublinhado ou algo assim?

Obrigado!


Se você não deseja criar uma nova matriz, a emenda é a única opção. Aposto que o sublinhado também o usa (internamente, se esse método existir).
Felix Kling

6
O que há de errado com a emenda?
Šime Vidas

Você verificou a referência do sublinhado?
Šime Vidas

Apenas usando JavaScript simples, esta é uma duplicata de remover objetos da matriz por propriedade do objeto .
Felix Kling

5
bem não é duplicado, pois tem a tag para underscore.js
Garis M Suero

Respostas:


279

Apenas usando JavaScript simples, isso já foi respondido: remova objetos da matriz por propriedade do objeto .

Usando underscore.js, você pode combinar .findWherecom .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>

Embora, já que você esteja criando uma nova matriz nesse caso, você pode simplesmente usar _.filterou a Array.prototype.filterfunção nativa (como mostrado na outra pergunta). Então você iteraria sobre a matriz apenas uma vez, em vez de potencialmente duas vezes como aqui.

Se você quiser modificar a matriz no local , precisará usar .splice. Isso também é mostrado na outra pergunta e o undescore não parece fornecer nenhuma função útil para isso.


1
Sim, isso funciona perfeitamente, eu examinei a documentação de sublinhado, mas não entendi direito como extraí-la sem. Obrigado!
Cloneid

10
_.Reject ou _.filter () seria muito mais eficiente aqui? Você terminaria com duas iterações da lista apenas para extrair um item.
Rick Strahl

1
Pode ser uma duplicata, mas esta é a melhor resposta.
Michael J. Calkins

2
@ RickStrahl Você está certo. _.rejectparece uma seleção melhor aqui.
Tarik

1
@lukaserat estalar o último elemento, uso arr.pop()...
Emile Bergeron

96

Você pode usar 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
    });

Também pode ser escrito como:

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

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

Verificar violino

Você também pode usar .reject


Eu acho que você quis dizer: var filter = _.filter (arr, function (item) {return item.id! == 3});
tbh__

2
@tbh__ _()criará um wrapper em torno da coleção que permitirá que você invoque métodos de sublinhado.
Sushanth

Estou usando sublinhado há anos, nunca soube disso. Graças
tbh__


16

O sublinhado possui um método _without () perfeito para remover um item de uma matriz, especialmente se você tiver o objeto a ser removido.

Retorna uma cópia da matriz com todas as instâncias dos valores removidos.

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

=> ["bob", "fred"]

Também trabalha com objetos mais complexos.

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 você não tiver o item para remover, apenas uma propriedade dele, você pode usar _.findWheree, em seguida _.without.


2
Nota: isso só funciona porque você está passando o objeto sam para sem. Se você passar { Name: "Sam", Age: 19 }para o sem, e não a variável sam, ela não funcionará mais. Fiddle
Adam

5

Tenha cuidado se estiver filtrando seqüências de caracteres e procurando filtros que não diferenciam maiúsculas de minúsculas. _.without () faz distinção entre maiúsculas e minúsculas. Você também pode usar _.reject () como mostrado abaixo.

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

Outras respostas criam uma nova cópia da matriz, se você quiser modificar a matriz no local, poderá usar:

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

Mas isso pressupõe que o elemento sempre será encontrado dentro da matriz (porque, se não for encontrado, ainda removerá o último elemento). Para estar seguro, você pode usar:

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

2

ou outra maneira útil:

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

meus 2 centavos


1
omit trabalha objecte retorna um object. portanto, não é muito bom para trabalhar com Arraysonde podemos esperar uma arrayvolta depois de remover um elemento.
ScrapCode 8/16

1
Então, _.without é o que você está vendo: _.without([1, 2, 1, 0, 3, 1, 4], 0, 1); => [2, 3, 4]
Nadeem

2

Use pode usar planície JavaScript 's Array#filtermétodo como este:

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);

Ou use Array#reducee Array#concatmétodos como este:

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:

  • Ambos são uma abordagem funcional pura ( ou seja, eles não modificam a matriz existente).
  • Não, é necessária uma biblioteca externa nessa abordagem (o Vanilla JavaScript é suficiente).

0

Eu costumava tentar esse método

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

Também pode haver métodos melhores, como as soluções acima fornecidas pelos usuários


0

Usando 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);

O resultado será: [{id:1name:'a'},{id:2,name:'c'}]


-1

Você pode usar o método rejeitar de sublinhado; abaixo, retornará uma nova matriz que não terá matriz com correspondência específica

arr = _.reject(arr, function(objArr){ return objArr.id == 3; });
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.