Necesito verificar una matriz de JavaScript para ver si hay valores duplicados. ¿Cuál es la forma más fácil de hacer esto? Solo necesito encontrar cuáles son los valores duplicados: en realidad no necesito sus índices o cuántas veces se duplican.
Sé que puedo recorrer la matriz y verificar todos los demás valores para una coincidencia, pero parece que debería haber una manera más fácil.
Pregunta similar:
javascript
arrays
Scott Saunders
fuente
fuente
Respuestas:
Puede ordenar la matriz y luego ejecutarla y luego ver si el índice siguiente (o anterior) es el mismo que el actual. Suponiendo que su algoritmo de clasificación sea bueno, esto debería ser menor que O (n 2 ):
En el caso, si va a regresar como una función para duplicados. Esto es para un tipo similar de caso.
Referencia: https://stackoverflow.com/a/57532964/8119511
fuente
arr = [9, 9, 9, 111, 2, 3, 3, 3, 4, 4, 5, 7];
i++
. En cambio, dicen que no escribanj = i + +j
. Dos cosas diferentes en mi humilde opinión. Creo quei += 1
es más confuso que lo simple y hermosoi++
:)var sorted_arr = arr.sort()
es inútil:arr.sort()
muta la matriz original (que es un problema en sí mismo). Esto también descarta un elemento. (Ejecute el código anterior. ¿Qué sucede con 9?) Cc @dystroy Una solución más limpia seríaresults = arr.filter(function(elem, pos) { return arr.indexOf(elem) == pos; })
Si desea eliminar los duplicados, pruebe esta excelente solución:
Fuente: http://dreaminginjavascript.wordpress.com/2008/08/22/eliminating-duplicates/
fuente
Esta es mi respuesta del hilo duplicado (!):
Al escribir esta entrada 2014, todos los ejemplos fueron for-loops o jQuery. Javascript tiene las herramientas perfectas para esto: ordenar, asignar y reducir.
Encuentra artículos duplicados
Sintaxis más funcional:
@ Dmytro-Laptin señaló que se debe eliminar algún código. Esta es una versión más compacta del mismo código. Usando algunos trucos ES6 y funciones de orden superior:
fuente
Encuentra valores duplicados en una matriz
Esta debería ser una de las formas más cortas de encontrar valores duplicados en una matriz. Como lo solicitó específicamente el OP, esto no elimina los duplicados, sino que los encuentra .
Esto no necesita ordenación ni ningún marco de terceros. Tampoco necesita bucles manuales. Funciona con cada valor indexOf () (o para ser más claro: el operador de comparación estricta ) es compatible.
Debido a reduce () e indexOf () necesita al menos IE 9.
fuente
const dupes = items.reduce((acc, v, i, arr) => arr.indexOf(v) !== i && acc.indexOf(v) === -1 ? acc.concat(v) : acc, [])
Puede agregar esta función, o modificarla y agregarla al prototipo de matriz de Javascript:
fuente
ACTUALIZADO: Lo siguiente utiliza una estrategia combinada optimizada. Optimiza las búsquedas primitivas para beneficiarse del tiempo de búsqueda hash O (1) (la ejecución
unique
en una matriz de primitivas es O (n)). Las búsquedas de objetos se optimizan etiquetando objetos con una identificación única mientras se itera, por lo que identificar objetos duplicados también es O (1) por elemento y O (n) para toda la lista. La única excepción son los elementos que están congelados, pero son raros y se proporciona un respaldo mediante una matriz e indexOf.Si tiene Colecciones ES6 disponibles, entonces hay una versión mucho más simple y significativamente más rápida. (calce para IE9 + y otros navegadores aquí: https://github.com/Benvie/ES6-Harmony-Collections-Shim )
fuente
ACTUALIZADO: una línea corta para obtener los duplicados:
Para obtener la matriz sin duplicados, simplemente invierta la condición:
Simplemente no pensé
filter()
en mi vieja respuesta a continuación;)Cuando todo lo que necesita es verificar que no haya duplicados como se le preguntó en esta pregunta , puede usar el
every()
método:Tenga en cuenta que
every()
no funciona para IE 8 y versiones inferiores.fuente
fuente
'a'
en la matriz, dentro de la función de filtroindex == 1
, mientras queself.indexOf('a') == 0
Esto debería darte lo que quieres, solo los duplicados.
fuente
usando underscore.js
fuente
ES2015
Encuentre valores únicos de 3 matrices (o más):
Solo un polyfill para array indexOf para navegadores antiguos:
Solución jQuery usando "inArray":
en lugar de agregar el
Array.prototype.indexOf
fuente
var r = [];
para que tu código funcionara. Y funcionó a las mil maravillas.r
variableAquí está mi solución simple y de una línea.
Primero no busca elementos únicos, luego hace que la matriz encontrada sea única con el uso de Set.
Entonces tenemos una serie de duplicados al final.
fuente
Esta es mi propuesta (ES6):
fuente
undefined
es un duplicado.o cuando se agrega al prototyp.chain de Array
Ver aquí: https://gist.github.com/1305056
fuente
i&&
es para evitar salir de los límites de la matriz, pero también significa que el primer elemento de la matriz ordenada no se incluirá. En su ejemplo no hay1
en la matriz resultante. Es decir,return i&&v!==o[i-1]?v:0;
debe haberreturn v!==o[i-1];
Manera rápida y elegante usando es6 objeto de desestructuración y reducción
Se ejecuta en O (n) (1 iteración sobre la matriz) y no repite valores que aparecen más de 2 veces
fuente
Aquí está la solución más simple que se me ocurre:
Eso es.
Nota:
Funciona con cualquier número
0
, incluidas cadenas y números negativos, por ejemplo-1
: Pregunta relacionada: Obtener todos los valores únicos en una matriz de JavaScript (eliminar duplicados)La matriz original
arr
se conserva (filter
devuelve la nueva matriz en lugar de modificar la original)La
filtered
matriz contiene todos los duplicados; también puede contener más de 1 mismo valor (por ejemplo, nuestra matriz filtrada aquí es[ 2, 2, 0, 0, -1, 'a', 'a' ]
)Si desea obtener solo valores duplicados (no desea tener múltiples duplicados con el mismo valor) puede usar
[...new Set(filtered)]
(ES6 tiene un conjunto de objetos que puede almacenar solo valores únicos)Espero que esto ayude.
fuente
La vainilla más corta JS :
fuente
Aquí hay una manera muy ligera y fácil:
fuente
Con ES6 (o usando Babel o typescipt) simplemente puede hacer:
https://es6console.com/j58euhbt/
fuente
Código simple con sintaxis ES6 (devolver matriz ordenada de duplicados):
Cómo utilizar:
fuente
un trazador de líneas
fuente
indx!
Qué hace para el primer ejemplo?indx !== ...
- desigualdad estricta.result.filter((ele,indx) => indx !== result.map(e => e.name).indexOf(ele.name));
Esta respuesta también puede ser útil, aprovecha el
reduce
operador / método js para eliminar duplicados de la matriz.fuente
new Set([1, 2, 2, 3, 3, 3, 3])
para eliminar duplicadosLa siguiente función (una variación de la función deleteDuplicates ya mencionada) parece hacer el truco, devolviendo test2,1,7,5 para la entrada ["test", "test2", "test2", 1, 1, 1, 2 , 3, 4, 5, 6, 7, 7, 10, 22, 43, 1, 5, 8]
Tenga en cuenta que el problema es más extraño en JavaScript que en la mayoría de los otros idiomas, porque una matriz de JavaScript puede contener casi cualquier cosa. Tenga en cuenta que las soluciones que utilizan la ordenación pueden necesitar proporcionar una función de ordenación adecuada; todavía no he probado esa ruta.
Esta implementación particular funciona para (al menos) cadenas y números.
fuente
Solo ES5 (es decir, necesita un polyfill filter () para IE8 y versiones inferiores):
fuente
Esta función evita el paso de clasificación y utiliza el método reduce () para enviar duplicados a una nueva matriz si aún no existe.
fuente
Esta es probablemente una de las formas más rápidas de eliminar permanentemente los duplicados de una matriz 10 veces más rápido que la mayoría de las funciones aquí. Y 78 veces más rápido en safari
si no puede leer el código anterior, pregunte, lea un libro de JavaScript o aquí hay algunas explicaciones sobre el código más corto. https://stackoverflow.com/a/21353032/2450730
EDITAR Como se indica en los comentarios, esta función devuelve una matriz con elementos únicos, sin embargo, la pregunta pide encontrar los duplicados. en ese caso, una simple modificación a esta función permite insertar los duplicados en una matriz, luego, al usar la función anterior, se
toUnique
eliminan los duplicados de los duplicados.fuente
Usando "incluye" para probar si el elemento ya existe.
fuente
ES6 ofrece la estructura de datos Set, que es básicamente una matriz que no acepta duplicados. Con la estructura de datos Set, hay una manera muy fácil de encontrar duplicados en una matriz (usando solo un bucle).
Aquí está mi código
fuente
Acabo de descubrir una manera simple de lograr esto usando un filtro de matriz
fuente
Seguir la lógica será más fácil y rápido
Ventajas:
Descripción de la lógica:
Nota: los métodos map () y filter () son eficientes y más rápidos.
fuente