Eu gostaria de entender a melhor maneira de filtrar uma matriz de todos os elementos de outra . Eu tentei com a função de filtro, mas não vem a mim como dar os valores que eu quero remover.
Algo como:
var array = [1,2,3,4];
var anotherOne = [2,4];
var filteredArray = array.filter(myCallback);
// filteredArray should now be [1,3]
function myCallBack(){
return element ! filteredArray;
//which clearly can't work since we don't have the reference <,<
}
caso a função de filtro não seja útil, como você implementaria isso?
Edit: verifiquei a possível pergunta duplicada, e poderia ser útil para quem entende javascript facilmente. A resposta marcada como boa facilita as coisas.
javascript
arrays
filter
Koop4
fonte
fonte
return arrTwo.indexOf(e) === -1;
código:var filteredArr = firstArr.filter(el => secondArr.indexOf(el) === -1);
Respostas:
Você pode usar o
this
parâmetro dafilter()
função para evitar armazenar sua matriz de filtros em uma variável global.fonte
this
.this
sempre parece estar indefinido ?! EstranhoEu faria o seguinte;
fonte
const filteredResults = this.state.cards.filter( result => !this.state.filterOut.includes(result.category) )
onde this.state.cards em uma matriz de objetos e this.state.filterOut é uma matriz de valores que corresponde à chave 'category' nos objetos que Eu queria remover.No retorno de chamada, você verifica se cada valor de
array
estáanotherOne
https://jsfiddle.net/0tsyc1sx/
Se você estiver usando
lodash.js
, use_.difference
Demo
Se você tiver uma matriz de objetos:
Demonstração da matriz de objetos
Demonstração da variedade de objetos com lodash
fonte
id
emanotherOne_el.id == array_el.id
com o que a chave que você tem em seu próprio objeto. Você deve obter conhecimento sobre matrizes e objetos em javascript, pois isso ajudará você a entender melhor a resposta #fonte
O código abaixo é a maneira mais simples de filtrar uma matriz em relação a outra matriz. Ambas as matrizes podem ter objetos dentro delas, em vez de valores.
Resultado:
[3, 6]
fonte
Existem muitas respostas para sua pergunta, mas não vejo ninguém usando a expressão lambda:
fonte
Todas as soluções acima "funcionam", mas têm desempenho abaixo do ideal e todas abordam o problema da mesma maneira que procura linearmente todas as entradas em cada ponto usando Array.prototype.indexOf ou Array.prototype.includes . Uma solução muito mais rápida (muito mais rápida do que uma pesquisa binária na maioria dos casos) seria classificar as matrizes e pular adiante conforme você avança, como visto abaixo. No entanto, uma desvantagem é que isso exige que todas as entradas na matriz sejam números ou seqüências de caracteres. Além disso, no entanto, em alguns casos raros, a pesquisa binária pode ser mais rápida que a pesquisa linear progressiva. Esses casos decorrem do fato de que minha pesquisa linear progressiva tem uma complexidade de O (2n 1 + n 2 ) (somente O (n 1+ n 2 ) no mais rápido C / C ++ versão) (em que n 1 é a matriz procurou e n 2 representa a disposição de filtro), ao passo que a pesquisa binária tem uma complexidade de O (n 1 ceil (log 2 n 2 )) ( ceil = arredondar para cima - até o teto ) e, por último, o índice da pesquisa tem uma complexidade altamente variável entre O (n 1 ) e O (n 1 n 2 ) , com média de O (n 1 ceil (n 2 (2)) . Assim, indexOf será apenas o mais rápido, em média, nos casos de(n 1 , n 2 ) igual a {1,2} , {1,3} ou {x, 1 | x∈N} . No entanto, essa ainda não é uma representação perfeita do hardware moderno. O IndexOf é otimizado nativamente ao máximo possível na maioria dos navegadores modernos, tornando-o muito sujeito às leis de previsão de ramificação . Portanto, se fizermos a mesma suposição no indexOf que fazemos com a pesquisa linear e binária progressiva - que a matriz é pré-classificada -, de acordo com as estatísticas listadas no link, podemos esperar uma velocidade de aproximadamente 6x para IndexOf, deslocando sua complexidade para O (n 1 ÷ 6) e O (n 1 n 2 ), calculando a média para O (n 1 teto (n 2 7 ÷ 12)) . Por fim, observe que a solução abaixo nunca funcionará com objetos porque os objetos em JavaScript não podem ser comparados por ponteiros em JavaScript.
Consulte meu outro post aqui para obter mais detalhes sobre o algoritmo de pesquisa binária usado
Se você é sensível ao tamanho do arquivo (que eu respeito), pode sacrificar um pouco de desempenho para reduzir bastante o tamanho do arquivo e aumentar a capacidade de manutenção.
Para provar a diferença de velocidade, vamos examinar alguns JSPerfs. Para filtrar uma matriz de 16 elementos , a pesquisa binária é aproximadamente 17% mais rápida que indexOf, enquanto filterArrayByAnotherArray é aproximadamente 93% mais rápida que indexOf. Para filtrar uma matriz de 256 elementos , a pesquisa binária é aproximadamente 291% mais rápida que o indexOf, enquanto filterArrayByAnotherArray é aproximadamente 353% mais rápido que o indexOf. Para filtrar uma matriz de 4096 elementos , a pesquisa binária é aproximadamente 2655% mais rápida que o indexOf, enquanto filterArrayByAnotherArray é aproximadamente 4627% mais rápido que o indexOf.
Filtragem reversa (como uma porta AND)
A seção anterior forneceu o código para pegar a matriz A e a matriz B e remover todos os elementos de A existentes em B:
Esta próxima seção fornecerá código para filtragem reversa, onde removemos todos os elementos de A que NÃO existem em B. Esse processo é funcionalmente equivalente a apenas reter os elementos comuns a A e B, como uma porta AND:
Aqui está o código para a filtragem reversa:
Para a versão menor e mais lenta do código de filtragem reversa, veja abaixo.
fonte
O OA também pode ser implementado no ES6 da seguinte maneira
ES6:
fonte
A melhor descrição para a
filter
função é https://developer.mozilla.org/pl/docs/Web/JavaScript/Referencje/Obiekty/Array/filterVocê deve simplesmente condicionar a função:
E você não pode acessar o valor da variável antes que ele seja atribuído
fonte
Você pode configurar a função de filtro para iterar sobre a "matriz de filtros".
fonte
Você pode usar o filtro e, em seguida, para a função de filtro, use uma redução da matriz de filtragem que verifica e retorna true quando encontra uma correspondência e depois inverte no retorno (!). A função de filtro é chamada uma vez por elemento na matriz. Você não está fazendo uma comparação de nenhum dos elementos da função em sua postagem.
fonte
fonte
fonte
Uma matriz de filtragem mais flexível de outra matriz que contém propriedades do objeto
fonte
Você pode escrever uma função genérica filterByIndex () e usar a inferência de tipo no TS para salvar o aborrecimento com a função de retorno de chamada:
digamos que você tenha sua matriz [1,2,3,4] que deseja filtrar () com os índices especificados na matriz [2,4].
a função byIndex espera a função de elemento e uma matriz e fica assim:
resultado é então
fonte
Os exemplos a seguir usam
new Set()
para criar uma matriz filtrada que possui apenas elementos exclusivos:Matriz com tipos de dados primitivos: string, número, booleano, nulo, indefinido, símbolo:
Matriz com objetos como itens:
fonte
Abaixo está um exemplo
fonte
A solução de Jack Giffin é ótima, mas não funciona para matrizes com números maiores que 2 ^ 32. Abaixo está uma versão rápida e refatorada para filtrar uma matriz com base na solução de Jack, mas funciona para matrizes de 64 bits.
fonte