Preciso verificar uma matriz JavaScript para ver se existem valores duplicados. Qual é a maneira mais fácil de fazer isso? Eu só preciso encontrar quais são os valores duplicados - na verdade, não preciso dos índices ou quantas vezes eles são duplicados.
Eu sei que posso percorrer a matriz e verificar todos os outros valores para uma correspondência, mas parece que deve haver uma maneira mais fácil.
Pergunta semelhante:
javascript
arrays
Scott Saunders
fonte
fonte
Respostas:
Você pode classificar a matriz e, em seguida, executá-la e verificar se o índice seguinte (ou anterior) é igual ao atual. Supondo que seu algoritmo de classificação seja bom, isso deve ser menor que O (n 2 ):
No caso, se você quiser retornar como uma função para duplicatas. Isso é para um tipo semelhante de caso.
Referência: https://stackoverflow.com/a/57532964/8119511
fonte
arr = [9, 9, 9, 111, 2, 3, 3, 3, 4, 4, 5, 7];
i++
. Em vez disso, eles dizem para não escreverj = i + +j
. Duas coisas diferentes IMHO. Eu acho quei += 1
é mais confuso do que a simples e bonitoi++
:)var sorted_arr = arr.sort()
é inútil:arr.sort()
transforma a matriz original (que é um problema por si só). Isso também descarta um elemento. (Executar o código acima O que acontece a 9.?) Solução mais limpa cc @dystroy Um seriaresults = arr.filter(function(elem, pos) { return arr.indexOf(elem) == pos; })
Se você deseja calcular as duplicatas, tente esta ótima solução:
Fonte: http://dreaminginjavascript.wordpress.com/2008/08/22/eliminating-duplicates/
fonte
Esta é a minha resposta do segmento duplicado (!):
Ao escrever esta entrada em 2014 - todos os exemplos foram for-loops ou jQuery. Javascript tem as ferramentas perfeitas para isso: classificar, mapear e reduzir.
Encontre itens duplicados
Sintaxe mais funcional:
@ Dmytro-Laptin apontou que algum código de código deve ser removido. Esta é uma versão mais compacta do mesmo código. Usando alguns truques do ES6 e funções de ordem superior:
fonte
Encontre valores duplicados em uma matriz
Essa deve ser uma das maneiras mais curtas de encontrar valores duplicados em uma matriz. Conforme solicitado especificamente pelo OP, isso não remove duplicatas, mas as encontra .
Isso não precisa ser classificado ou qualquer estrutura de terceiros. Também não precisa de loops manuais. Funciona com todos os valores indexOf () (ou, para ser mais claro: o operador de comparação estrita ) suporta.
Por causa de replace () e indexOf (), ele precisa pelo menos do IE 9.
fonte
const dupes = items.reduce((acc, v, i, arr) => arr.indexOf(v) !== i && acc.indexOf(v) === -1 ? acc.concat(v) : acc, [])
Você pode adicionar essa função ou ajustá-la e adicioná-la ao protótipo de matriz do Javascript:
fonte
ATUALIZADO: O seguinte usa uma estratégia combinada otimizada. Ele otimiza as pesquisas primitivas para se beneficiar do tempo de pesquisa do hash O (1) (a execução
unique
em uma matriz de primitivas é O (n)). As pesquisas de objeto são otimizadas, marcando objetos com um ID exclusivo, enquanto iteram, de modo que a identificação de objetos duplicados também seja O (1) por item e O (n) para toda a lista. A única exceção são os itens congelados, mas esses são raros e um fallback é fornecido usando uma matriz e indexOf.Se você tiver o ES6 Collections disponível, haverá uma versão muito mais simples e significativamente mais rápida. (shim para o IE9 + e outros navegadores aqui: https://github.com/Benvie/ES6-Harmony-Collections-Shim )
fonte
ATUALIZADO: Uma linha curta para obter as duplicatas:
Para obter a matriz sem duplicatas, basta inverter a condição:
Eu simplesmente não pensei
filter()
na minha antiga resposta abaixo;)Quando tudo que você precisa é verificar se não há duplicatas, conforme solicitado nesta pergunta, você pode usar o
every()
método:Observe que
every()
não funciona no IE 8 e abaixo.fonte
fonte
'a'
na matriz, a função de filtro no interior doindex == 1
, enquanto queself.indexOf('a') == 0
Isso deve fazer o que você quer, apenas as duplicatas.
fonte
usando underscore.js
fonte
ES2015
Encontre valores exclusivos de 3 matrizes (ou mais):
Apenas um polyfill para índice de matriz
Solução jQuery usando "inArray":
em vez de adicionar o
Array.prototype.indexOf
fonte
var r = [];
para obter o seu código funcionando. E funcionou como charme.r
variávelAqui está a minha solução simples e de uma linha.
Ele procura primeiro elementos não exclusivos e, em seguida, torna a matriz encontrada única com o uso de Set
Portanto, temos uma série de duplicatas no final.
fonte
Esta é a minha proposta (ES6):
fonte
undefined
é uma duplicata.ou quando adicionado ao prototyp.chain da matriz
Veja aqui: https://gist.github.com/1305056
fonte
i&&
que isso evite sair dos limites da matriz, mas também significa que o primeiro elemento na matriz classificada não será incluído. No seu exemplo, não há1
na matriz resultante.return i&&v!==o[i-1]?v:0;
return v!==o[i-1];
Maneira rápida e elegante usando a desestruturação de objetos es6 e reduza
É executado em O (n) (1 iteração sobre a matriz) e não repete valores que aparecem mais de 2 vezes
fonte
Aqui está a solução mais simples que eu poderia pensar:
É isso aí.
Nota:
Funciona com qualquer número
0
, incluindo strings e números negativos, por exemplo-1
- Pergunta relacionada: Obtenha todos os valores exclusivos em uma matriz JavaScript (remova duplicatas)A matriz original
arr
é preservada (filter
retorna a nova matriz em vez de modificar a original)A
filtered
matriz contém todas as duplicatas; ele pode também conter mais do que um mesmo valor (por exemplo, a matriz é filtrada aqui[ 2, 2, 0, 0, -1, 'a', 'a' ]
)Se você deseja obter apenas valores duplicados (não deseja ter várias duplicatas com o mesmo valor), pode usar
[...new Set(filtered)]
(o ES6 tem um conjunto de objetos que pode armazenar apenas valores exclusivos)Espero que isto ajude.
fonte
JS de baunilha mais curto :
fonte
Aqui está uma maneira muito leve e fácil:
fonte
Com o ES6 (ou usando Babel ou Typescipt), você pode simplesmente:
https://es6console.com/j58euhbt/
fonte
Código simples com sintaxe ES6 (retorne uma matriz classificada de duplicatas):
Como usar:
fonte
um forro
fonte
indx!
faz para o primeiro exemplo?indx !== ...
- desigualdade estrita.result.filter((ele,indx) => indx !== result.map(e => e.name).indexOf(ele.name));
Essa resposta também pode ser útil, pois utiliza o
reduce
operador / método js para remover duplicatas da matriz.fonte
new Set([1, 2, 2, 3, 3, 3, 3])
para remover duplicatasA função a seguir (uma variação da função deleteDuplicates já mencionada) parece fazer o truque, retornando teste2,1,7,5 para a entrada ["teste", "teste2", "teste2", 1, 1, 1, 2 , 3, 4, 5, 6, 7, 7, 10, 22, 43, 1, 5, 8]
Observe que o problema é mais estranho no JavaScript do que na maioria dos outros idiomas, porque uma matriz JavaScript pode conter praticamente qualquer coisa. Observe que as soluções que usam classificação podem precisar fornecer uma função de classificação apropriada - ainda não tentei essa rota.
Essa implementação específica funciona para (pelo menos) seqüências de caracteres e números.
fonte
Somente ES5 (ou seja, ele precisa de um polyfill de filtro () para o IE8 e abaixo):
fonte
Essa função evita a etapa de classificação e usa o método reduzem () para enviar duplicatas para uma nova matriz, se ela ainda não existir.
fonte
Essa é provavelmente a maneira mais rápida de remover permanentemente as duplicatas de uma matriz 10 vezes mais rápido que a maioria das funções aqui. & 78x mais rápido no safari
se você não conseguir ler o código acima, pergunte, leia um livro em javascript ou aqui estão algumas explicações sobre códigos mais curtos. https://stackoverflow.com/a/21353032/2450730
EDITAR Conforme declarado nos comentários, esta função retorna uma matriz com únicos, mas a pergunta pede para encontrar as duplicatas. nesse caso, uma simples modificação dessa função permite inserir as duplicatas em uma matriz e, em seguida, usar a função anterior
toUnique
remove as duplicatas das duplicatas.fonte
Usando "includes" para testar se o elemento já existe.
fonte
O ES6 oferece a estrutura de dados do conjunto, que é basicamente uma matriz que não aceita duplicatas. Com a estrutura de dados do conjunto, há uma maneira muito fácil de encontrar duplicatas em uma matriz (usando apenas um loop).
Aqui está o meu código
fonte
Acabei de descobrir uma maneira simples de conseguir isso usando um filtro Array
fonte
Seguir a lógica será mais fácil e rápido
Vantagens:
Descrição da lógica:
Nota: os métodos map () e filter () são eficientes e mais rápidos.
fonte