var listToDelete = ['abc', 'efg'];
var arrayOfObjects = [{id:'abc',name:'oh'}, // delete me
{id:'efg',name:'em'}, // delete me
{id:'hij',name:'ge'}] // all that should remain
Como faço para remover um objeto da matriz, correspondendo à propriedade do objeto?
Somente JavaScript nativo, por favor.
Estou tendo problemas para usar a emenda porque o comprimento diminui a cada exclusão. Usar clone e splicing no índice original ainda deixa você com o problema de diminuir o comprimento.
javascript
Dan Kanze
fonte
fonte
Respostas:
Eu suponho que você usou
splice
algo assim?Tudo o que você precisa fazer para corrigir o erro é diminuir
i
para a próxima vez (e fazer um loop para trás também é uma opção):Para evitar exclusões de tempo linear, você pode escrever os elementos da matriz que deseja manter sobre a matriz:
e para evitar pesquisas de tempo linear em um tempo de execução moderno, você pode usar um conjunto de hash:
que pode ser envolvido em uma boa função:
Se você não precisa fazer isso no lugar, é
Array#filter
:fonte
Você pode remover um item por uma de suas propriedades sem usar nenhuma biblioteca de terceiros como esta:
fonte
Com lodash / sublinhado:
Se você deseja modificar a própria matriz existente, precisamos usar a emenda . Aqui está a maneira um pouco melhor / legível usando findWhere de underscore / lodash:
Com ES5 ou superior
( sem lodash / sublinhado )
Com o ES5 em diante, temos o
findIndex
método no array, portanto é fácil sem lodash / sublinhado(O ES5 é suportado em quase todos os navegadores morden)
Sobre o findIndex e sua compatibilidade com o navegador
fonte
items.splice(items.findIndex(i => i.id === "abc"), 1)
O findIndex funciona para navegadores modernos:
fonte
Para excluir um objeto por seu ID em determinada matriz;
fonte
Se você apenas deseja removê-lo da matriz existente e não criar uma nova, tente:
fonte
Faça um loop invertido decrementando
i
para evitar o problema:Ou use
filter
:fonte
Verifique isso usando o filtro Set e ES6.
Aqui está o JsFiddle: https://jsfiddle.net/jsq0a0p1/1/
fonte
Como uma solução alternativa, mais "funcional", trabalhando no ECMAScript 5, você pode usar:
De acordo com a definição de 'Array.prototype.reduceRight' no ECMA-262 :
Portanto, este é um uso válido de
reduceRight
.fonte
conforme sua resposta será assim. quando você clica em algum objeto específico, envia o índice no parâmetro para a função excluir-me. Este código simples funcionará como charme.
fonte
com filter & indexOf
com filtro e inclui
fonte
Se você gosta de parâmetros curtos e auto-descritivos ou se não deseja usar
splice
e usar um filtro direto ou se é simplesmente uma pessoa SQL como eu:E uma amostra de uso:
fonte
Você pode usar
filter
. Este método sempre retorna o elemento se a condição for verdadeira. Portanto, se você deseja remover por ID, deve manter todo o elemento que não corresponde ao ID fornecido. Aqui está um exemplo:fonte