Tengo dos matrices de JavaScript:
var array1 = ["Vijendra","Singh"];
var array2 = ["Singh", "Shakya"];
Quiero que la salida sea:
var array3 = ["Vijendra","Singh","Shakya"];
La matriz de salida debería tener palabras repetidas eliminadas.
¿Cómo fusiono dos matrices en JavaScript para obtener solo los elementos únicos de cada matriz en el mismo orden en que se insertaron en las matrices originales?
javascript
arrays
merge
Vijjendra
fuente
fuente
Respuestas:
Para fusionar las matrices (sin eliminar duplicados)
Uso de la versión ES5
Array.concat
:Versión ES6 uso desestructuración
Dado que no hay una forma 'incorporada' de eliminar duplicados ( ECMA-262 realmente tiene lo
Array.forEach
que sería genial para esto), tenemos que hacerlo manualmente:Luego, para usarlo:
Esto también preservará el orden de las matrices (es decir, no es necesario ordenarlas).
Dado que muchas personas están molestas por el aumento de prototipos
Array.prototype
y losfor in
bucles, aquí hay una forma menos invasiva de usarlo:Para aquellos que tienen la suerte de trabajar con navegadores donde ES5 está disponible, pueden usar
Object.defineProperty
esto:fuente
[a, b, c]
y[x, b, d]
sea las matrices (suponga comillas). Concat da[a, b, c, x, b, d]
. No sería la salida de unique ()[a, c, x, b, d]
. Que no conserva el orden Creo - Creo PO quiere[a, b, c, x, d]
for ... in
conhasOwnProperty
en cuyo caso el método prototipo está bienCon Underscore.js o Lo-Dash puedes hacer:
http://underscorejs.org/#union
http://lodash.com/docs#union
fuente
underscore.flatten()
, que es mejor que la unión, ya que requiere una gran variedad de matrices.Primero concatene las dos matrices, luego filtre solo los elementos únicos:
Editar
Como se sugirió, una solución más inteligente sería filtrar los elementos únicos
b
antes de concatenar cona
:fuente
a
para agregarb
, ¿será mejor recorrer y usar push?a.forEach(function(item){ if(a.indexOf(item)<0) a.push(item); });
var c = [...a, ...b.filter(o => !~a.indexOf(o))];
2.var c = [...new Set([...a, ...b])];
☺Esta es una solución ECMAScript 6 que utiliza operadores de propagación y genéricos de matriz.
Actualmente solo funciona con Firefox, y posiblemente con Internet Explorer Technical Preview.
Pero si usas Babel , puedes tenerlo ahora.
fuente
Array.from
se puede usar en lugar del operador de propagación:Array.from(new Set([].concat(...arr)))
ES6
O
O
fuente
union
en todos + 1er ejemplo golpes hasta la pila para grandesArray
s + tercera ejemplo es increíblemente lento y consume una gran cantidad de memoria, ya que dos intermediosArray
s tienen que ser de construcción + tercera ejemplo, sólo se puede utilizar paraunion
una conocida número deArray
s en tiempo de compilación.Set
es el camino a seguir aquíUsando un Set (ECMAScript 2015), será tan simple como eso:
fuente
const array3 = [...new Set(array1.concat(array2))]
Aquí hay una versión ligeramente diferente del ciclo. Con algunas de las optimizaciones en la última versión de Chrome, es el método más rápido para resolver la unión de las dos matrices (Chrome 38.0.2111).
http://jsperf.com/merge-two-arrays-keeping-only-unique-values
ciclo while: ~ 589k ops / s
filtro: ~ 445k ops / s
lodash: 308k ops / s
para bucles: 225k ops / s
Un comentario señaló que una de mis variables de configuración estaba causando que mi ciclo se adelantara al resto, porque no tenía que inicializar una matriz vacía para escribir. Estoy de acuerdo con eso, así que reescribí la prueba para igualar el campo de juego e incluí una opción aún más rápida.
http://jsperf.com/merge-two-arrays-keeping-only-unique-values/52
En esta solución alternativa, combiné la solución de matriz asociativa de una respuesta para eliminar la
.indexOf()
llamada en el ciclo que ralentizaba mucho las cosas con un segundo ciclo, e incluí algunas de las otras optimizaciones que otros usuarios también han sugerido en sus respuestas. .La respuesta principal aquí con el doble bucle en cada valor (i-1) sigue siendo significativamente más lenta. a lodash todavía le está yendo bien, y todavía se lo recomendaría a cualquiera que no le importe agregar una biblioteca a su proyecto. Para aquellos que no quieren, mi ciclo while sigue siendo una buena respuesta y la respuesta del filtro tiene una muy buena presentación aquí, superando todas mis pruebas con el último Canary Chrome (44.0.2360) a partir de este escrito.
Echa un vistazo a la respuesta de Mike y la respuesta de Dan Stocker si quieres dar un paso a un nivel superior en la velocidad. Esos son, con mucho, el más rápido de todos los resultados después de analizar casi todas las respuestas viables.
fuente
Puede hacerlo simplemente con ECMAScript 6,
fuente
Array.from(new Set(array1.concat(array2)))
.tsconfig.json
, puede agregar"downlevelIteration": true
acompilerOptions
.Una función de combinación de matriz mucho mejor.
fuente
var test = ['a', 'b', 'c']; console.log(test);
imprimirá["a", "b", "c", merge: function]
Solo tirando mis dos centavos.
Este es un método que uso mucho, usa un objeto como una tabla hashlookup para hacer la verificación duplicada. Suponiendo que el hash es O (1), esto se ejecuta en O (n) donde n es a.length + b.length. Sinceramente, no tengo idea de cómo el navegador hace el hash, pero funciona bien en muchos miles de puntos de datos.
fuente
String()
función en javascript. Lo que podría funcionar para valores primitivos (aunque con colisiones entre tipos), pero no es una buena opción para matrices de objetos.Simplemente manténgase alejado de los bucles anidados (O (n ^ 2)) y
.indexOf()
(+ O (n)).fuente
Simplificó lo mejor de esta respuesta y la convirtió en una buena función:
fuente
¿Por qué no usas un objeto? Parece que estás tratando de modelar un conjunto. Sin embargo, esto no preservará el orden.
fuente
if (!set1.hasOwnProperty(key))
?La mejor solucion...
Puede verificar directamente en la consola del navegador presionando ...
Sin duplicado
Con duplicado
Si lo desea sin duplicar, puede probar una mejor solución desde aquí: Código de gritos .
Probar en la consola del navegador Chrome
Salida:
fuente
Mi centavo y medio:
fuente
Puede lograrlo simplemente usando Underscore.js's => uniq :
Imprimirá ["Vijendra", "Singh", "Shakya"] .
fuente
Para ES6, solo una línea:
fuente
Sé que esta pregunta no se trata de una variedad de objetos, pero los buscadores terminan aquí.
Por lo tanto, vale la pena agregar para futuros lectores una forma adecuada de combinar ES6 y luego eliminar duplicados
conjunto de objetos :
fuente
La implementación del
indexOf
método para otros navegadores se toma de MDCfuente
from
parámetro por cierto?indexOf
. Limpié el código eliminando la parte comentada. @meder: gracias de nuevo.Nueva solución (que usa
Array.prototype.indexOf
yArray.prototype.concat
):Uso:
Array.prototype.indexOf (para Internet Explorer):
fuente
Se puede hacer usando Set.
fuente
Hay tantas soluciones para fusionar dos matrices. Se pueden dividir en dos categorías principales (excepto el uso de bibliotecas de terceros como lodash o underscore.js).
a) combine dos matrices y elimine los elementos duplicados.
b) filtrar elementos antes de combinarlos.
Combina dos matrices y elimina elementos duplicados
Combinatorio
Unificador
Hay muchas formas de unificar una matriz, personalmente sugiero a continuación dos métodos.
Filtrar elementos antes de combinarlos
También hay muchas formas, pero personalmente sugiero el siguiente código debido a su simplicidad.
fuente
fuente
Lo bueno de este es el rendimiento y que, en general, cuando trabajas con matrices, estás encadenando métodos como filtro, mapa, etc. para que puedas agregar esa línea y concat y deduplicará array2 con array1 sin necesidad de una referencia a lo posterior uno (cuando está encadenando métodos que no tiene), ejemplo:
(No me gusta contaminar Array.prototype y esa sería la única forma de respetar la cadena: definir una nueva función la romperá, así que creo que algo como esto es la única forma de lograrlo)
fuente
Puedes probar esto:
fuente
Un enfoque funcional con ES2015
Seguir el enfoque funcional a
union
de dosArray
s es solo la composición deconcat
yfilter
. Para proporcionar un rendimiento óptimo, recurrimos alSet
tipo de datos nativo , que está optimizado para búsquedas de propiedades.De todos modos, la pregunta clave junto con una
union
función es cómo tratar los duplicados. Son posibles las siguientes permutaciones:Las dos primeras permutaciones son fáciles de manejar con una sola función. Sin embargo, los dos últimos son más complicados, ya que no puede procesarlos mientras confíe en las
Set
búsquedas. Dado que cambiar aObject
búsquedas de propiedades antiguas simples implicaría un golpe de rendimiento serio, la siguiente implementación simplemente ignora la tercera y cuarta permutación. Tendría que construir una versión separada deunion
para apoyarlos.De aquí en adelante, resulta trivial implementar una
unionn
función que acepte cualquier número de matrices (inspiradas en los comentarios de naomik):Resulta que
unionn
es solofoldl
(akaArray.prototype.reduce
), que tomaunion
como su reductor. Nota: Dado que la implementación no utiliza un acumulador adicional, arrojará un error cuando lo aplique sin argumentos.fuente
flip
ynotf
no se usan. También elunionBy
predicado pierde detalles de implementación (requiere conocimiento implícito delSet
tipo). Sería bueno si pudieras hacer algo como esto:union = unionBy (apply)
yunionci = unionBy (p => x => p(x.toLowerCase()))
. De esa forma, el usuario simplemente envía cualquier valor de agrupación ap
- solo una idea ^ _ ^zs
también falta la declaración de variablevar
/let
palabra clavepor el bien de esto ... aquí hay una solución de línea única:
No es particularmente legible, pero puede ayudar a alguien:
Set
.Set
a una matriz.sort()
función se aplica a la nueva matriz.fuente
reduce()
que pueda usarArray.from(set)
DeDuplicate single o Merge y DeDuplicate múltiples entradas de matriz. Ejemplo a continuación.
utilizando ES6 - Conjunto, para, de desestructuración
Escribí esta función simple que toma múltiples argumentos de matriz. Hace más o menos lo mismo que la solución anterior, solo tiene un caso de uso más práctico. Esta función no concatena valores duplicados en una sola matriz para que pueda eliminarlos en una etapa posterior.
DEFINICIÓN DE FUNCIÓN CORTA (solo 9 líneas)
EJEMPLO DE USO CODEPEN :
fuente
arr.map
aquí? Lo estás usando como unforeach
, ya que el resultado se ignorafuente
fuente