Eu estou procurando uma maneira eficiente de remover todos os elementos de uma matriz javascript, se eles estiverem presentes em outra matriz.
// If I have this array:
var myArray = ['a', 'b', 'c', 'd', 'e', 'f', 'g'];
// and this one:
var toRemove = ['b', 'c', 'g'];
Quero operar no myArray para deixá-lo neste estado: ['a', 'd', 'e', 'f']
Com jQuery, estou usando grep()
e inArray()
, que funciona bem:
myArray = $.grep(myArray, function(value) {
return $.inArray(value, toRemove) < 0;
});
Existe uma maneira javascript pura de fazer isso sem fazer loop e splicing?
javascript
arrays
Toque
fonte
fonte
.filter()
. Em vez disso, você usaráfor
loops. Você pode evitar.splice()
se o pedido original não precisar ser mantido. Ou existem maneiras de tornar.splice()
mais eficiente se você acha que haverá muitos itens a serem removidos.Respostas:
Use o
Array.filter()
método:Pequena melhoria, pois o suporte ao navegador
Array.includes()
aumentou:Próxima adaptação usando as funções de seta :
fonte
.difference()
que basicamente faz isso.toRemove()
para maiúsculas e altere o retorno de chamada deel
parael.toUpperCase()
.myArray = myArray.filter( el => !toRemove.includes( el ) );
O
filter
método deve fazer o truque:Se sua
toRemove
matriz for grande, esse tipo de padrão de pesquisa pode ser ineficiente. Seria mais eficiente criar um mapa para que as pesquisas sejamO(1)
mais do queO(n)
.fonte
Se você estiver usando uma matriz de objetos. Em seguida, o código abaixo deve fazer a mágica, onde uma propriedade de objeto será o critério para remover itens duplicados.
No exemplo abaixo, duplicatas foram removidas comparando o nome de cada item.
Tente este exemplo. http://jsfiddle.net/deepak7641/zLj133rh/
fonte
O Lodash também possui uma função utilitária: https://lodash.com/docs#difference
fonte
Os conjuntos ECMAScript 6 podem ser usados para calcular os diferentes elementos de duas matrizes:
fonte
Acabei de implementar como:
Use como:
fonte
prototypes
objetos nativos, por exemploArray
. Isso pode ter um conflito de longo prazo com o desenvolvimento futuro da língua ( ver oflatten
caso )Se você não pode usar coisas novas do ES5,
filter
acho que você está preso a dois loops:fonte
fonte
Agora com sabor de uma linha:
Pode não funcionar em navegadores antigos.
fonte
Você pode usar _.differenceBy do lodash
Exemplo de código aqui: CodePen
fonte
Que tal o mais simples possível:
fonte
includes
não está disponível antes do ES7.A maneira correta de remover todos os elementos contidos em outra matriz é tornar o mesmo objeto da matriz de origem, removendo apenas os elementos:
Ou equivalente ao CoffeeScript:
Teste nas ferramentas de desenvolvimento do chrome:
Usar a estrutura Angular é a melhor maneira de manter o ponteiro para o objeto de origem quando você atualiza coleções sem grande quantidade de observadores e recarregamentos.
fonte
Eu construo a lógica sem usar nenhum método interno. Informe-me sobre qualquer otimização ou modificação. Eu testei no editor JS, está funcionando bem.
fonte