Array spread объединить массив объектов

Как я могу объединить массивы объектов, используя синтаксис распространения?

Мои данные array могут быть любой длины, мне нужно объединить их все в mergedResults

Любые идеи?

   Promise.all(apiPromises).then(data => {
                let mergedResults = []
                data.forEach(function(element) {
                    const { events } = element;

                    mergedResults[...events]

                    console.log(mergedResults)
                });
   });

Вы пытаетесь объединить каждый объект в массиве в один результирующий объект? Можете ли вы привести пример ввода и желаемого результата?

Steve Archer 10.08.2018 14:35
2
1
740
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы должны их подтолкнуть:

  mergedResults.push(...events);

Если вы это сделаете:

  mergedResults[ something ]

это просто доступ к собственности.

Вот что означает буква W. :-)

T.J. Crowder 10.08.2018 14:35

@crowder да, когда я присоединился, я все еще немного заботился о своей конфиденциальности, но я сдался сейчас ... :) (вам все равно придется много гуглить, чтобы найти что-то значимое обо мне, так что ...)

Jonas Wilms 10.08.2018 14:40
Ответ принят как подходящий

Вы не можете добавить в массив существующий со спредом внутри [], вы можете создать только массив новый (как это делает concat):

mergedResults = [...mergedResults, ...events];

... что не очень эффективно, если допустимо изменение существующего массива (но обычно в ситуациях, когда важно оставить исходный массив в покое, например, при программировании с неизменяемыми объектами).

По этой причине вы можете использовать push с синтаксисом распространения:

mergedResults.push(...events);

Боковое примечание: вы можете использовать деструктуризацию в списке параметров forEach, а не как отдельный оператор:

Promise.all(apiPromises).then(data => {
    let mergedResults = [];
    data.forEach(({events}) => {
    // -----------^^^^^^^^
        mergedResults.push(...events);
    });
    // ...presumably do something with `mergedResults` here...
});

Возможно, еще подкинет for-of:

Promise.all(apiPromises).then(data => {
    let mergedResults = [];
    for ({events} of data) {
        mergedResults.push(...events);
    }
    // ...presumably do something with `mergedResults` here...
});

Или, как и во всех операциях с массивами, когда вы посещаете все элементы, вы можете втиснуть это в reduce, но вы ничего от этого не получите, это просто усложнит задачу:

Promise.all(apiPromises).then(data => {
    let mergedResults = data.reduce((results, {events}) => {
        results.push(...events);
        return results;
    }, []);
    // ...presumably do something with `mergedResults` here...
});

Другие вопросы по теме