Filtrelemeden sonra dizileri tek bir diziyle birleştir


14

Ben sadece konumlar dizisi almak nesneleri dizi var. Amacım bu konumlar dizisini bir diziye birleştirmek, ancak bunu yapmak ve boş dizi almak başarısız. Bunu nasıl yaparım:

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

burada yanlış yaptığım şey ne? Sonuç şu olmalıdır: ['aaaa', 'bbbbbb', 'cccccc', 'ddd', 'aaadsad', 'sefd', 'ffff', 'eeee', 'sfdsfsd'];

Yanıtlar:


9

filterBurada ihtiyacın yok. Dizideki her öğe için uygulanan mapbir geri çağrı sağlanan işlevi ileterek yöntemi kullanın .

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


1
@ user122222, rica ederim! flatMapBurada kendi uygulamanızı oluşturabilirsiniz : stackoverflow.com/questions/39837678/…
Mihai Alexandru-Ionut

7

Şunları deneyebilirsiniz flatMap():

flatMap()Yöntem, ilk olarak daha sonra yeni bir diziye sonucu düzleştirir bir eşleştirme işlevi kullanılarak her bir elemanını. Bu aynı olan map()bir takip flat()bölgesinin derinliği 1 , ancak flatMap()bir yönteme iki birleştirme biraz daha etkili olduğu için, genellikle oldukça faydalıdır.

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


6

İstediğiniz Array#flatMapözelliği ile taka bir olabilir . Özellik verilmezse, varsayılan bir dizi ekleyin || [].

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


2
.FlatMap, çoklu dolgular olmadan Edge ve IE'de çalışmaz.
Zydnar

3

Array.prototype öğesinden Küçült işlevini kullanarak da çözebilir .

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

Bu yardımcı olur umarım


2

Diğer cevapları hiç şüphesiz daha performanslı ve okunabilir olmasına rağmen, kendi çözümümü yayınlamamak için çok uzun zaman harcadım. Orijinal yayınınızla aynı türde bir strateji kullanır ve bu da nerede yanlış gittiğini göstermeye yardımcı olabilir.

const locationIds = [].concat
                    .apply([], results.filter(result => 
                    result.locations && result.locations.length > 0)
                    .map(result => { return result.locations }));
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.