Como mesclar duas matrizes que estão dentro de objetos individuais como propriedade

8

Eu tenho dois objetos como este:

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

Eu preciso mesclá-los dentro de uma única matriz como esta

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

Eu tentei usar lodash union e mapa, mas sem sorte.

Mian Muhammad
fonte

Respostas:

15

Solução de uma linha 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
fonte
5

Com o Vanilla JS, você pode iterar Array.flatMap()e retornar o slotIDspara obter uma matriz de IDs. Para remover duplicatas, crie um conjunto da matriz e espalhe o conjunto de volta para uma matriz:

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

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

console.log(result)

Com o lodash, você pode iterar _.flatMap()e obter o slotIDspara obter uma variedade de IDs. Use _.uniq()Para remover duplicatas:

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
fonte
3

Tentar

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

Editar - Aqui está uma versão mais simples ou de uma linha.

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

Como o @OriDrori sugeriu, os métodos acima alteram o próprio obj1 e não funcionam bem em perguntas semelhantes, onde o Obj1 tem várias chaves e pares de valores. Aqui está o que você faz para evitar isso

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

Nota rápida - O uso de Array.from()é opcional.

Saurav
fonte
1
é uma complicada lógica para um simples, mas funciona
Mian Muhammad
@MianMuhammad Não vou discutir, É exatamente como você preferir :-)
Saurav
Sua substituição código obj1.slotIDscom obj2.slotIDs, e não mesclar as matrizes, e recebe apenas os valores exclusivos. Adicione outro ID exclusivo ao obj1.slotIDs, e ele desaparecerá no resultado, ou apenas altere a ordem dos objetos na atribuição a obj2, obj1e verifique o resultado.
Ori Drori
@OriDrori a solução foi problema era específico da pergunta e não é a melhor solução, eu concordo.
precisa
Vou adicionar uma solução melhor também :)
Saurav
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
fonte
Sua substituição código obj1.slotIDscom obj2.slotIDs, e não mesclar as matrizes, e recebe apenas os valores exclusivos. Adicione outro ID exclusivo ao obj1.slotIDs, e ele desaparecerá no resultado, ou apenas altere a ordem dos objetos na atribuição a obj2, obj1e verifique o 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)


Resposta antiga:

Que tal { ...obj1, ...obj2 }.slotIDs?

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

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

console.log(result)

Larry N
fonte
1
Wao, isso é outra solução simples Thanks :)
Mian Muhammad
0

Se o seu objeto puder ter propriedades adicionais que armazenam valores de matriz e você desejar mesclar tudo isso em uma matriz exclusiva, poderá usar Object.entries()com .map()e, em seguida, a Setpara remover as duplicatas:

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
fonte