Posible duplicado:
forma más fácil de encontrar valores duplicados en una matriz de JavaScript
¿Cómo verifico si una matriz tiene valores duplicados?
Si algunos elementos de la matriz son iguales, devuelve verdadero. De lo contrario, devuelve falso.
['hello','goodbye','hey'] //return false because no duplicates exist
['hello','goodbye','hello'] // return true because duplicates exist
Tenga en cuenta que no me importa encontrar la duplicación, solo quiero un resultado booleano si las matrices contienen duplicaciones.
javascript
duplicates
usuario847495
fuente
fuente
var test=['hello','goodbye','hello'] ; if ( test.length != _.unique(test).length ) { // some code }
Respuestas:
Si tiene un entorno ES2015 (al momento de escribir este artículo: io.js, IE11, Chrome, Firefox, WebKit nightly), lo siguiente funcionará y será rápido (a saber, O (n)):
function hasDuplicates(array) { return (new Set(array)).size !== array.length; }
Si solo necesita valores de cadena en la matriz, lo siguiente 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 una "tabla hash"
valuesSoFar
cuyas claves son los valores que hemos visto en la matriz hasta ahora. Hacemos una búsqueda usandoin
para ver si ese valor ya ha sido detectado; si es así, salimos del bucle y regresamostrue
.Si necesita una función que funcione para algo más que valores de cadena, lo siguiente funcionará, pero no es tan eficaz; es O (n 2 ) en lugar 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; }
La diferencia es simplemente que usamos una matriz en lugar de una tabla hash
valuesSoFar
, ya que las "tablas hash" de JavaScript (es decir, los objetos) solo tienen claves de cadena. Esto significa que perdemos el tiempo de búsqueda O (1) dein
, en lugar de obtener un tiempo de búsqueda O (n) deindexOf
.fuente
hasDuplicates
, entonces debería verificar si el tamaño del conjunto realmente se redujo durante el proceso de conversión, ¿verdad? Por lo tanto, el operador booleano debería ser!==
y no===
true
para la siguiente matriz:[1, '1']
Otro enfoque (también para elementos de objeto / matriz dentro de la matriz 1 ) podría 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
Ver también...
1 necesita un navegador que admita JSON, o una biblioteca JSON si no.
2 edición: la función ahora se puede usar para una verificación simple o para devolver una matriz de valores duplicados
fuente
null
,NaN
,Infinity
,+Infinity
, y-Infinity
; 3) los objetos se consideran iguales si tienen las mismas propiedades propias, incluso si tienen diferentes prototipos.Bueno, busqué un poco en Internet para usted y encontré este útil enlace.
La forma más sencilla de encontrar valores duplicados en una matriz de JavaScript
Puede adaptar el código de muestra que se proporciona en el enlace anterior, cortesía de "swilliams" a su solución.
fuente