Gabungkan array ke satu array setelah difilter

14

Saya punya banyak objek, di mana saya hanya mengambil lokasi. Tujuan saya adalah menggabungkan array lokasi ini menjadi satu array, namun saya gagal melakukannya dan mendapatkan array kosong. Beginilah cara saya melakukannya:

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

apa yang saya lakukan salah di sini? Hasilnya seharusnya ['aaaa', 'bbbbbb', 'cccccc', 'ddd', 'aaadsad', 'sefd', 'ffff', 'eeee', 'sfdsfsd'];

pengguna122222
sumber

Jawaban:

9

Anda tidak perlu di filtersini. Cukup gunakan mapmetode dengan melewati fungsi callback yang disediakan yang diterapkan untuk setiap item pada array.

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
sumber
1
@ user122222, sama-sama Anda dapat membuat implementasi Anda sendiri flatMapseperti di sini: stackoverflow.com/questions/39837678/…
Mihai Alexandru-Ionut
7

Anda dapat mencoba dengan flatMap():

The flatMap()Metode pertama memetakan setiap elemen menggunakan fungsi pemetaan, maka merata hasilnya ke array baru. Hal ini identik dengan map()diikuti oleh flat()dari kedalaman 1 , tapi flatMap()sering cukup berguna, karena menggabungkan kedua menjadi satu metode adalah sedikit lebih efisien.

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
sumber
6

Anda dapat mengambil Array#flatMapdengan properti yang diinginkan. Jika properti tidak diberikan, tambahkan array default || [].

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
sumber
2
Ada baiknya untuk menyebutkan .flatMap tidak berfungsi di Edge dan IE tanpa polyfill.
Zydnar
3

Dapat juga menyelesaikan menggunakan fungsi Reduce dari Array.prototype.

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

semoga ini membantu

skyhavoc
sumber
2

Saya menghabiskan waktu terlalu lama untuk tidak memposting solusi saya sendiri - teka-teki yang menarik bagi saya, meskipun jawaban lain tidak diragukan lagi lebih berkinerja dan mudah dibaca. Ini menggunakan jenis strategi yang sama dengan posting asli Anda, yang mungkin membantu menunjukkan di mana kesalahannya.

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