JavaScript - Hur man lägger alla objekt från flera nästlade arrayer i en ny array med unika objekt


Jag har en array av objekt som kallas packages. Varje objekt har en egenskap som kallas modules som är en annan array av objekt. Varje objekt i varje modules-array har ett unikt ID. Jag vill lägga varje unikt objekt från alla modules-arrayer i en enda array, med hjälp av ID.

packages = [
  { id: 1, modules:[{ id: 1, name: 'module1' }, { id: 2, name: 'module2' }]},
  { id: 2, modules:[{ id: 1, name: 'module1' }, { id: 3, name: 'module3' }]},
  { id: 3, modules:[{ id: 2, name: 'module2' }, { id: 4, name: 'module4' }]} 
];

Jag behöver resultatet att vara:

allModules = [
  { id: 1, name: 'module1' },
  { id: 2, name: 'module2' },
  { id: 3, name: 'module3' },
  { id: 4, name: 'module4' }
];

Jag använder TypeScript, men inte ES6.

Svar #1

Du kan använda Array-metoder som reduce och filter för att få din lista över unika moduler:

var packages = [
  { id: 1, modules:[{ id: 1, name: 'module1' }, { id: 2, name: 'module2' }]},
  { id: 2, modules:[{ id: 1, name: 'module1' }, { id: 3, name: 'module3' }]},
  { id: 3, modules:[{ id: 2, name: 'module2' }, { id: 4, name: 'module4' }]} 
]

var result = packages.reduce(function (a, e) {
  return a.concat(e.modules)
}, []).filter(function (e) {
  return !this[e.id] && (this[e.id] = true)
}, {})

console.log(result)