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.forEachque 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.prototypey losfor inbucles, 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.definePropertyesto: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 ... inconhasOwnPropertyen 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
bantes de concatenar cona:fuente
apara 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.fromse puede usar en lugar del operador de propagación:Array.from(new Set([].concat(...arr)))ES6
O
O
fuente
unionen todos + 1er ejemplo golpes hasta la pila para grandesArrays + tercera ejemplo es increíblemente lento y consume una gran cantidad de memoria, ya que dos intermediosArrays tienen que ser de construcción + tercera ejemplo, sólo se puede utilizar paraunionuna conocida número deArrays en tiempo de compilación.Setes 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": trueacompilerOptions.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
indexOfmétodo para otros navegadores se toma de MDCfuente
fromparámetro por cierto?indexOf. Limpié el código eliminando la parte comentada. @meder: gracias de nuevo.Nueva solución (que usa
Array.prototype.indexOfyArray.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
unionde dosArrays es solo la composición deconcatyfilter. Para proporcionar un rendimiento óptimo, recurrimos alSettipo de datos nativo , que está optimizado para búsquedas de propiedades.De todos modos, la pregunta clave junto con una
unionfunció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
Setbúsquedas. Dado que cambiar aObjectbú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 deunionpara apoyarlos.De aquí en adelante, resulta trivial implementar una
unionnfunción que acepte cualquier número de matrices (inspiradas en los comentarios de naomik):Resulta que
unionnes solofoldl(akaArray.prototype.reduce), que tomaunioncomo su reductor. Nota: Dado que la implementación no utiliza un acumulador adicional, arrojará un error cuando lo aplique sin argumentos.fuente
flipynotfno se usan. También elunionBypredicado pierde detalles de implementación (requiere conocimiento implícito delSettipo). 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 ^ _ ^zstambién falta la declaración de variablevar/letpalabra clavepor el bien de esto ... aquí hay una solución de línea única:
No es particularmente legible, pero puede ayudar a alguien:
Set.Seta 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.mapaquí? Lo estás usando como unforeach, ya que el resultado se ignorafuente
fuente