将所有对象的数据分组并推送到一个

问题描述

我正在努力实现以下目标: 假设您有一个对象数组,如下所示:

[{familyName: "Winston",data: [{},{}]},{familyName: "Winston",{familyName: "Levi",{}]}]

我想要实现的是将每个姓氏分组到一个新对象中,该对象将包含相同姓氏的所有数据。例如:

[ { familyName: "Winston",data:[{},{},{}] },{ familyName: "Levi",{}] } //new array will contain the combined data objects

因此,最后,我将拥有一个数组,其中每个唯一属性都有一个对象 + 该特定属性的所有数据对象的总和。 我设法通过创建一个“模板数组”然后按如下方式推送它来实现这一点:

for (let name of array) {
            for (let property of templateArray) {
                if (name.familyName === property.familyName) {
                    property.data.push(name)
                }
            }
        }

我希望找到一个更优雅、更高效的解决方案,甚至可能不需要事先创建模板数组。有没有? 谢谢!

解决方法

您可以将一个带有 familyName 的对象作为键并收集该对象。最后只取对象中的值作为结果。

const
    data = [{ familyName: "Winston",data: [{},{}] },{ familyName: "Winston",{ familyName: "Levi",{}] }],result = Object.values(data.reduce((r,o) => {
        (r[o.familyName] ??=  { ...o,data: [] }).data.push(...o.data);
        return r;
    },{}));

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