Possível duplicata:
maneira mais fácil de encontrar valores duplicados em uma matriz javascript
Como posso verificar se uma matriz tem valores duplicados?
Se alguns elementos da matriz forem iguais, retorne verdadeiro. Caso contrário, retorna falso.
['hello','goodbye','hey'] //return false because no duplicates exist
['hello','goodbye','hello'] // return true because duplicates exist
Observe que não me importo em encontrar a duplicação, só quero o resultado booleano se os arrays contiverem duplicações.
javascript
duplicates
user847495
fonte
fonte
var test=['hello','goodbye','hello'] ; if ( test.length != _.unique(test).length ) { // some code }
Respostas:
Se você tiver um ambiente ES2015 (no momento da redação deste artigo: io.js, IE11, Chrome, Firefox, WebKit noturno), o seguinte funcionará e será rápido (viz. O (n)):
function hasDuplicates(array) { return (new Set(array)).size !== array.length; }
Se você só precisa de valores de string na matriz, o seguinte funcionará:
function hasDuplicates(array) { var valuesSoFar = Object.create(null); for (var i = 0; i < array.length; ++i) { var value = array[i]; if (value in valuesSoFar) { return true; } valuesSoFar[value] = true; } return false; }
Usamos uma "tabela de hash"
valuesSoFar
cujas chaves são os valores que vimos no array até agora. Fazemos uma pesquisa usandoin
para ver se esse valor já foi localizado; se for assim, saímos do circuito e voltamostrue
.Se você precisa de uma função que funcione para mais do que apenas valores de string, o seguinte funcionará, mas não tem um desempenho tão bom; é O (n 2 ) em vez de O (n).
function hasDuplicates(array) { var valuesSoFar = []; for (var i = 0; i < array.length; ++i) { var value = array[i]; if (valuesSoFar.indexOf(value) !== -1) { return true; } valuesSoFar.push(value); } return false; }
A diferença é simplesmente que usamos um array em vez de uma tabela hash para
valuesSoFar
, uma vez que as "tabelas hash" JavaScript (ou seja, objetos) têm apenas chaves de string. Isso significa que perdemos o tempo de pesquisa O (1) dein
, em vez de obter um tempo de pesquisa O (n) deindexOf
.fonte
hasDuplicates
, ela deve verificar se o tamanho do conjunto realmente encolheu durante o processo de conversão, certo? Portanto, o operador booleano deve ser!==
e não===
true
para a seguinte matriz:[1, '1']
Outra abordagem (também para elementos de objeto / matriz dentro da matriz 1 ) poderia ser 2 :
function chkDuplicates(arr,justCheck){ var len = arr.length, tmp = {}, arrtmp = arr.slice(), dupes = []; arrtmp.sort(); while(len--){ var val = arrtmp[len]; if (/nul|nan|infini/i.test(String(val))){ val = String(val); } if (tmp[JSON.stringify(val)]){ if (justCheck) {return true;} dupes.push(val); } tmp[JSON.stringify(val)] = true; } return justCheck ? false : dupes.length ? dupes : null; } //usages chkDuplicates([1,2,3,4,5],true); //=> false chkDuplicates([1,2,3,4,5,9,10,5,1,2],true); //=> true chkDuplicates([{a:1,b:2},1,2,3,4,{a:1,b:2},[1,2,3]],true); //=> true chkDuplicates([null,1,2,3,4,{a:1,b:2},NaN],true); //=> false chkDuplicates([1,2,3,4,5,1,2]); //=> [1,2] chkDuplicates([1,2,3,4,5]); //=> null
Veja também...
1 precisa de um navegador que suporte JSON ou uma biblioteca JSON se não for.
2 editar: a função agora pode ser usada para verificação simples ou para retornar uma matriz de valores duplicados
fonte
null
,NaN
,Infinity
,+Infinity
, e-Infinity
; 3) os objetos são considerados iguais se tiverem as mesmas propriedades próprias, mesmo que tenham protótipos diferentes.Bem, eu fiz uma pequena pesquisa na Internet para você e encontrei este link útil.
Maneira mais fácil de encontrar valores duplicados em uma matriz JavaScript
Você pode adaptar o código de amostra fornecido no link acima, cortesia de "swilliams" para sua solução.
fonte