【问题标题】:Grouping and pushing data from all objects into one [duplicate]将所有对象的数据分组并推送到一个[重复]
【发布时间】:2021-02-20 08:56:05
【问题描述】:

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

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

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

[ { familyName: "Winston", data:[{},{},{},{},{},{}] }, { familyName: "Levi", data: [{},{},{},{}] } //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)
                }
            }
        }

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

【问题讨论】:

    标签: javascript arrays javascript-objects


    【解决方案1】:

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

    const
        data = [{ familyName: "Winston", data: [{}, {}] }, { familyName: "Winston", data: [{}, {}] }, { familyName: "Winston", data: [{}, {}] }, { familyName: "Levi", data: [{}, {}] }, { familyName: "Levi", data: [{}, {}] }],
        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; }

    【讨论】:

    • 谢谢!请问这是什么语法? "??=" 我的 ide 给我一个错误:SyntaxError: Unexpected token '?'
    • 这是一个logical nullish assignment ??=,你可以用logical OR ||替换(r[o.familyName] ??= { ...o, data: [] })(r[o.familyName] = r[o.familyName] || { ...o, data: [] })
    猜你喜欢
    • 1970-01-01
    • 2015-04-20
    • 2014-05-16
    • 1970-01-01
    • 2014-06-07
    • 2021-12-04
    • 2022-01-14
    • 2019-06-07
    • 2017-03-02
    相关资源
    最近更新 更多