Echemos un vistazo a un ejemplo.
var arr1 = new Array({name: "lang", value: "English"}, {name: "age", value: "18"});
var arr2 = new Array({name : "childs", value: '5'}, {name: "lang", value: "German"});
Necesito fusionar esas 2 matrices de objetos y crear la siguiente matriz:
arr3 = new Array({name: "lang", value: "German"}, {name: "age", value: "18"}, {name : "childs", value: '5'});
¿Hay alguna función de JavaScript o jQuery para hacer esto?
$.extend
no me queda bien. Vuelve
arr4 = new Array({name : "childs", value: '5'}, {name: "lang", value: "German"});
javascript
jquery
arrays
Alejandro
fuente
fuente
{name: "lang", value: "English"}
?Respuestas:
Si desea fusionar 2 matrices de objetos en JavaScript. Puedes usar este truco de una línea
Array.prototype.push.apply(arr1,arr2);
Por ejemplo
Salida:
fuente
arr1 = arr1.concat(arr2)
concat
devolverá una nueva matriz y romperá cualquier referencia que tenga.Con ES6 puede hacerlo muy fácil como se muestra a continuación:
Salida:
fuente
{ name: 'lang', value: 'German'}
Para aquellos que están experimentando con cosas modernas:
fuente
Actualización 12 Oct 2019
Nueva versión basada solo en Javascript más reciente y sin la necesidad de ninguna biblioteca de terceros.
Esta respuesta se estaba volviendo vieja, las bibliotecas como lodash y el subrayado son mucho menos necesarias en estos días. En esta nueva versión, la matriz de destino (arr1) es con la que estamos trabajando y queremos mantener actualizada. La matriz de origen (arr2) es de donde provienen los nuevos datos y queremos que se fusionen en nuestra matriz de destino .
Recorrimos la matriz de origen en busca de nuevos datos, y para cada objeto que aún no se encuentra en nuestra matriz de destino , simplemente agregamos ese objeto usando target.push (sourceElement) Si, según nuestra propiedad clave ('nombre') , un el objeto ya está en nuestra matriz de destino; actualizamos sus propiedades y valores usando Object.assign (targetElement, sourceElement) . Nuestro "objetivo" siempre será el mismo conjunto y con contenido actualizado.
Respuesta anterior usando guión bajo o lodash
Siempre llego aquí desde google y no siempre estoy satisfecho con las respuestas. TU respuesta es buena, pero será más fácil y ordenado usando subrayado.js
DEMO: http://jsfiddle.net/guya/eAWKR/
Aquí hay una función más general que fusionará 2 matrices usando una propiedad de sus objetos. En este caso, la propiedad es 'nombre'
fuente
fuente
Muy simple usando el operador de propagación ES6:
Merged Array: [ {a: 'HI!'}, {b: 'HOW'} {c: 'ARE'}, {d: 'YOU?'} ]
Nota: La solución anterior es simplemente fusionar dos matrices utilizando el operador de propagación ES6.
Edite el 07 de enero de 2020 por @ bh4r4th: como el contexto cambió debido a las ediciones después de mi solución inicial. Me gustaría actualizar mi solución para que coincida con los criterios actuales. es decir,
Fusionar objetos de matriz sin crear objetos duplicados y,
actualizar
value
si laname
propiedad ya existe en la matriz anteriorfuente
set
después de la fusión para eliminar duplicados. Esto crearía un nuevo argumento variable pero un código mínimo. Sin embargo, no soy un gran fanático de la carga útil que tiene nombres definidos como propiedades y valores como tipos diferentes. En cambio prefiero[ { lang: 'German', age: 25}]
. De esta forma, el peso de la carga útil se minimizará durante la comunicación entre servicios.Fusionando dos matrices:
Fusionando dos matrices sin valores duplicados para 'nombre':
fuente
La forma más fácil es con algo de magia ES6:
Fusionar dos con duplicados:
Sin duplicados es igual que el anterior más:
const distinct = [...new Set(result.map(item => item.YOUR_PROP_HERE))]
fuente
Con lodash:
fuente
Así es como he abordado un problema similar en un contexto de ES6:
Nota: Este enfoque no devolverá ningún elemento de array1 que no aparezca en array2.
EDITAR: Tengo algunos escenarios en los que quiero conservar elementos que no aparecen en la segunda matriz, así que se me ocurrió otro método.
fuente
Otra versión más que usa
reduce() method
:fuente
fuente
Puede usar un objeto para recopilar sus propiedades mientras reemplaza los duplicados y luego expandir / aplanar ese objeto de nuevo a una matriz. Algo como esto:
No sé si esta es la forma más rápida, pero funciona para cualquier cantidad de matrices de entrada; por ejemplo, esto:
Te da lo mismo
a
que estaba enarr3
con "Alemán" reemplazado por "Pancakes".Este enfoque supone que todos sus objetos tienen la misma
{name: ..., value: ...}
forma, por supuesto.Puedes verlo funcionando aquí (abre tu consola por favor): http://jsfiddle.net/ambiguous/UtBbB/
fuente
¿Qué pasa con jQuery Merge?
http://api.jquery.com/jQuery.merge/
Ejemplo de jsFiddle aquí: http://jsfiddle.net/ygByD/
fuente
name
propiedades.Estaba enfrentando el mismo problema y, según la respuesta de guya , extendí la biblioteca de subrayado y también agregué un poco más de funcionalidad que necesitaba. Aquí está la esencia .
¡Espero que te sea de utilidad! ¡Saludos!
fuente
Recientemente me quedé perplejo con este problema y vine aquí con la esperanza de tener una respuesta, pero la respuesta aceptada usa 2 bucles for in que no preferiría. Finalmente logré hacer el mío. No depende de ninguna biblioteca en absoluto:
Esto también mantiene el orden de arr1.
fuente
podrías usar la siguiente función
y prueba
fuente
Aquí primero filtro
arr1
según el elemento presentearr2
o no. Si está presente, no lo agregue a la matriz resultante; de lo contrario, agregue. Y luego agregoarr2
al resultado.fuente
Fuera de mi cabeza - prueba jquery extend
fuente
var newArray = yourArray.concat(otherArray); console.log('Concatenated newArray: ', newArray);
fuente
Array.protype.push.apply()
respuesta, pero no hace la fusión como OP quería.Basado en la respuesta de @ YOU pero manteniendo el orden:
Sé que esta solución es menos eficiente, pero es necesaria si desea mantener el orden y aún actualizar los objetos.
fuente
Aquí hay un complemento de jQuery que escribí para fusionar dos matrices de objetos con una clave. Tenga en cuenta que esto modifica la matriz de destino en el lugar.
Versión ES6
fuente
Usando lodash quieres _.uniqBy
¡El orden de arr1, arr2 importa!
Ver documentos https://lodash.com/docs/4.17.4#uniqBy
fuente
fuente
fuente
Si desea fusionar las 2 matrices, pero eliminar objetos duplicados, use esto. Los duplicados se identifican en
.uniqueId
cada objetofuente
Prueba esto:
OutPut será:
fuente
fuente
Solución que utiliza JS Map:
Que produce:
fuente
fuente