tengo esta matriz 2,
const firstArray = [ { key: 'a', value: 'a' }, { key: 'b', value: 'b' }, { key: 'c', value: 'c' } ] const secondArray = [ { key: 'b', value: 'd' }, { key: 'c', value: 'e' } ]
quiero fusionar estas 2 matrices, y si se encuentra la misma clave en la segunda matriz, el valor de la segunda matriz reemplazará el valor de la primera matriz
la nueva matriz debería verse así
const expectedArray = [ { key: 'a', value: 'a' }, { key: 'b', value: 'd' }, { key: 'c', value: 'e' } ]
Como veo lodash
en sus etiquetas, asumo que desea usarlo.
Puedes usar algo como esto:
var merged = _(firstArray) .concat(secondArray) .groupBy("key") .map(_.spread(_.merge)) .value();
Básicamente, agrupa todos los objetos con la misma clave en una matriz con groupBy("key")
, luego aplana cada matriz de valores fusionándolos y tomando el último con .map(_.spread(_.merge))
.
Sugiero comentar los me gusta finales y ver todos los pasos intermedios si quieres entender completamente el proceso, ¡es interesante!
const firstArray = [{ key: 'a', value: 'a' }, { key: 'b', value: 'b' }, { key: 'c', value: 'c' } ] const secondArray = [{ key: 'b', value: 'd' }, { key: 'c', value: 'e' } ] var merged = _(firstArray) .concat(secondArray) .groupBy("key") .map(_.spread(_.merge)) .value(); console.log(merged);
<script src="https://cdn.jsdelivr.net/lodash/4.13.1/lodash.min.js"></script>
La solución sin lodash
es iterar a través de la segunda matriz y solo buscar coincidencias.
Si no hay ninguna coincidencia, empuje el elemento a la primera matriz.
Si hay una coincidencia, reemplace el elemento de la primera matriz con el de la segunda matriz.
const mergedArray = [...firstArray] secondArray.forEach(newItem => { const matchIndex = mergedArray.findIndex(prevItem => prevItem.key === newItem.key) if (matchIndex === -1) { mergedArray.push(newItem) } else { mergedArray[matchIndex] = newItem } })
const mergedArray = [...secondArray, ...firstArray]; const lengthOfUniqueArray = new Set(mergedArray.map((item) => item.key)).size; const expectedArray = newArray.slice(0, lengthOfUniqueArray);
expectedArray
será lo que quieras.