Führen Sie Arrays nach dem Filtern zu einem Array zusammen

14

Ich habe ein Array von Objekten, bei denen ich nur ein Array von Standorten nehme. Mein Ziel ist es, dieses Speicherort-Array zu einem Array zusammenzuführen. Ich schaffe es jedoch nicht und erhalte ein leeres Array. So mache ich es:

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);

Was mache ich hier falsch? Das Ergebnis sollte sein ['aaaa', 'bbbbbb', 'cccccc', 'ddd', 'aaadsad', 'sefd', 'ffff', 'eeee', 'sfdsfsd'];

user122222
quelle

Antworten:

9

Du brauchst filterhier nicht. Verwenden Sie einfach die mapMethode, indem Sie eine Rückruffunktion übergeben , die für jedes Element im Array angewendet wird.

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);

Mihai Alexandru-Ionut
quelle
1
@ user122222, du bist willkommen! Sie können Ihre eigene Implementierung flatMapwie folgt
Mihai Alexandru-Ionut
7

Sie können versuchen mit flatMap():

Die flatMap()Methode ordnet zuerst jedes Element mithilfe einer Zuordnungsfunktion zu und glättet dann das Ergebnis in ein neues Array. Es ist identisch mit einem map()gefolgt von einem mit flat()der Tiefe 1 , flatMap()ist jedoch häufig sehr nützlich, da das Zusammenführen beider zu einer Methode etwas effizienter ist.

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);

Mamun
quelle
6

Sie könnten eine Array#flatMapmit der gewünschten Eigenschaft nehmen. Wenn die Eigenschaft nicht angegeben ist, fügen Sie ein Standardarray hinzu || [].

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

console.log(locationIds);
.as-console-wrapper { max-height: 100% !important; top: 0; }

Nina Scholz
quelle
2
Es ist gut zu erwähnen, dass .flatMap in Edge und IE ohne Polyfills nicht funktioniert.
Zydnar
3

Kann auch mit der Funktion Reduzieren aus Array.prototype gelöst werden.

var newResults = results.reduce(function(acc, curr) {
    return acc.concat(curr.locations)
  },[]
)

hoffe das hilft

skyhavoc
quelle
2

Ich habe zu lange damit verbracht, meine eigene Lösung nicht zu veröffentlichen - ein interessantes Rätsel für mich, obwohl die anderen Antworten zweifellos performanter und lesbarer sind. Es verwendet dieselbe Strategie wie Ihr ursprünglicher Beitrag, um herauszufinden, wo ein Fehler aufgetreten ist.

const locationIds = [].concat
                    .apply([], results.filter(result => 
                    result.locations && result.locations.length > 0)
                    .map(result => { return result.locations }));
lawrence-witt
quelle