javascript - Slå samman arrayer till en array efter filtrering


Jag har en array med objekt, där jag endast tar locations-arrayen. Mitt mål är att slå samman dessa locations-arrayer till en array, men jag lyckas inte göra det och får en tom array. Så här gör jag:

let results = [{
    id: '1',
    locations: ['aaaa', 'bbbbbb', 'cccccc']
  },
  {
    id: '2',
    locations: []
  },
  {
    id: '3',
    locations: ['ddd', 'aaadsad', 'sefd']
  },
  {
    id: '4',
    locations: ['ffff', 'eeee', 'sfdsfsd']
  },
];
const locationIds = [].concat.apply([], ...results.filter(s => s.locations && s.locations.length > 0).map(({
  locations
}) => ({
  locations
})));

console.log(locationIds);

vad gör jag fel här? Resultatet borde vara ['aaaa', 'bbbbbb', 'cccccc', 'ddd', 'aaadsad', 'sefd', 'ffff', 'eeee', 'sfdsfsd'];

Svar #1

Du behöver inte filter här. Använd bara map-metoden genom att skicka en callback-anges funktion som tillämpas på varje objekt i arrayen.

let results = [{ id: '1', locations: ['aaaa', 'bbbbbb', 'cccccc'] }, { id: '2', locations: [] }, { id: '3', locations: ['ddd', 'aaadsad', 'sefd'] }, { id: '4', locations: ['ffff', 'eeee', 'sfdsfsd'] }, ];

const locationIds = [].concat(...results.map(s => s.locations));

console.log(locationIds);

Svar #2

Du kan prova med flatMap():

Metoden flatMap() mappar först varje element med en mappingsfunktion och plattar sedan ut resultatet till en ny array. Den är identisk med en map() följt av en flat() med djup 1, men flatMap() är ofta ganska användbar, eftersom det att slå ihop båda till en metod är något mer effektivt.

let results = [{
    id: '1',
    locations: ['aaaa', 'bbbbbb', 'cccccc']
  },
  {
    id: '2',
    locations: []
  },
  {
    id: '3',
    locations: ['ddd', 'aaadsad', 'sefd']
  },
  {
    id: '4',
    locations: ['ffff', 'eeee', 'sfdsfsd']
  },
];
const locationIds = results.flatMap(i => i.locations);
console.log(locationIds);

Relaterade artiklar