Cómo fusionar dos matrices que están dentro de objetos individuales como propiedad

8

Tengo dos objetos como este:

let obj1 = { slotIDs: ["5e0301f353ee2a0546298f15"] }
let obj2 = { slotIDs: ["5e0301f353ee2a0546298f15", "5e03050453ee2a0546298f1c"] }

Necesito fusionarlos dentro de una sola matriz como esta

let newObj = ["5e0301f353ee2a0546298f15", "5e03050453ee2a0546298f1c"]

Intenté usar lodash union y map pero no tuve suerte.

Mian Muhammad
fuente

Respuestas:

15

Una línea de solución de código :

let obj1 = { slotIDs: ['5e0301f353ee2a0546298f15'] }
let obj2 = { slotIDs: ['5e0301f353ee2a0546298f15', '5e03050453ee2a0546298f1c'] }

const result = [...new Set([...obj1.slotIDs, ...obj2.slotIDs])]
console.log(result)

Loi Nguyen Huynh
fuente
5

Con Vanilla JS puede iterar Array.flatMap()y devolver el slotIDspara obtener una matriz de identificadores. Para eliminar duplicados, cree un Conjunto de la matriz y extienda el Conjunto a una matriz:

const obj1 = { slotIDs: ['5e0301f353ee2a0546298f15'] }
const obj2 = { slotIDs: ['5e0301f353ee2a0546298f15', '5e03050453ee2a0546298f1c'] }

const result = [...new Set([obj1, obj2].flatMap(o => o.slotIDs))]

console.log(result)

Con lodash puedes iterar _.flatMap()y tomar slotIDspara obtener una variedad de identificadores. Utilice _.uniq()Para eliminar duplicados:

const obj1 = { slotIDs: ['5e0301f353ee2a0546298f15'] }
const obj2 = { slotIDs: ['5e0301f353ee2a0546298f15', '5e03050453ee2a0546298f1c'] }

const result = _.uniq(_.flatMap([obj1, obj2], 'slotIDs'))

console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.js"></script>

Ori Drori
fuente
3

Tratar

let newObj= []
for(const value in Object.assign(obj1,obj2)["slotIDs"])
newObj.push(Object.assign(obj1,obj2)["slotIDs"][value])

Editar: aquí hay una versión más simple o de una línea.

let newObj=Object.assign(obj1,obj2)["slotIDs"]

Como @OriDrori sugirió, los métodos anteriores alteran el obj1 en sí mismo y no funcionan bien en preguntas similares donde Obj1 tiene múltiples pares de claves y valores. Esto es lo que debes hacer para evitar eso

let newObj=Array.from(new Set(obj1.slotIDs.concat(obj2.slotIDs)))

Nota rápida: el uso de Array.from()es opcional.

Saurav
fuente
1
es una lógica complicada para un simple, pero funciona
Mian Muhammad
@MianMuhammad No discutiré, así es como lo prefieres :-)
Saurav
Su anulación de código obj1.slotIDscon obj2.slotIDs, y no combina las matrices, y recibe sólo los valores únicos. Agregue otra identificación única al obj1.slotIDs, y desaparecerá en el resultado, o simplemente cambie el orden de los objetos en la asignación obj2, obj1y verifique el resultado.
Ori Drori
@OriDrori la solución fue un problema específico de la pregunta y no es la mejor solución, estoy de acuerdo.
Saurav
Aunque también
agregaré
2

Object.assign(obj1, obj2).slotIDs

const obj1 = { slotIDs: ['5e0301f353ee2a0546298f15'] }
const obj2 = { slotIDs: ['5e0301f353ee2a0546298f15', '5e03050453ee2a0546298f1c'] }

const result = Object.assign(obj1, obj2).slotIDs

console.log(result)

Hunh Try
fuente
Su anulación de código obj1.slotIDscon obj2.slotIDs, y no combina las matrices, y recibe sólo los valores únicos. Agregue otra identificación única al obj1.slotIDs, y desaparecerá en el resultado, o simplemente cambie el orden de los objetos en la asignación obj2, obj1y verifique el resultado.
Ori Drori
1

EDITAR:

let obj1 = { slotIDs: ['5e0301f353ee2a0546298f15', '5e0301f353ee2a0546298f16'] }
let obj2 = { slotIDs: ['5e0301f353ee2a0546298f15', '5e03050453ee2a0546298f1c'] }

let result = Array.from( new Set(obj1.slotIDs.concat(obj2.slotIDs)) )

console.log(result)


Vieja respuesta:

¿Qué tal { ...obj1, ...obj2 }.slotIDs?

let obj1 = { slotIDs: ['5e0301f353ee2a0546298f15'] }
let obj2 = { slotIDs: ['5e0301f353ee2a0546298f15', '5e03050453ee2a0546298f1c'] }

let result = { ...obj1, ...obj2 }.slotIDs

console.log(result)

Larry N
fuente
1
Wao, esa es otra solución simple Gracias :)
Mian Muhammad
0

Si su objeto puede tener propiedades adicionales que posean valores de la matriz y que le gustaría fusionar todos estos objetivos en una gama única que puede utilizar Object.entries()con .map()y luego una Seta eliminar los duplicados:

const obj1 = { slotIDs: ["5e0301f353ee2a0546298f15"], itemIds: ["xyz123"] };
const obj2 = { slotIDs: ["5e0301f353ee2a0546298f15", "5e03050453ee2a0546298f1c"], itemids: ["xyz123", "abc123"] };

const res = [...new Set([obj1, obj2].map(Object.values).flat(2))];
console.log(res);

Nick Parsons
fuente