数组传播合并对象数组

时间:2018-08-10 12:33:37

标签: javascript arrays

如何使用扩展语法合并对象数组?

我的数据array可以是任意长度,我需要将它们全部合并成mergedResults

有什么想法吗?

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

                    mergedResults[...events]

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

2 个答案:

答案 0 :(得分:3)

您必须推动它们:

  mergedResults.push(...events);

如果您这样做:

  mergedResults[ something ]

那只是属性访问。

答案 1 :(得分:3)

您无法添加到在[]内部散布的现有数组,只能创建一个 new 数组(就像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...
});