【问题标题】:group array with sub array带有子数组的组数组
【发布时间】:2014-10-29 19:49:00
【问题描述】:

我正在尝试找到最简单的方法来获取具有相似信息的数组并创建带有子数组的数组。新创建的父数组还应该对子数组中找到的值求和。这相当于使用 sum/group by 的 SQL 语句。

这是原始数组

[
    {
        'userId':1,
        'userName':'bob',
        'category':'shoes',
        'count':2
    },
    {
        'userId':1,
        'userName':'bob',
        'category':'rocks',
        'count':4
    },
    {
        'userId':1,
        'userName':'bob',
        'category':'bags',
        'count':3
    },
    {
        'userId':2,
        'userName':'sue',
        'category':'shoes',
        'count':1
    },
    {
        'userId':2,
        'userName':'sue',
        'category':'rocks',
        'count':7
    },
    {
        'userId':2,
        'userName':'sue',
        'category':'bags',
        'count':4
    },
]

这就是我希望新创建的数组的样子:

[
    {
        'userId':1,
        'userName':'bob',
        'purchases': [
            {'category':'shoes','count':'2'},
            {'category':'rocks','count':'4'},
            {'category':'bags','count':'3'}
        ],
        'totalCount' : 9
    },
    {
        'userId':2,
        'userName':'sue',
        'purchases': [
            {'category':'shoes','count':'1'},
            {'category':'rocks','count':'7'},
            {'category':'bags','count':'4'}
        ],
        'totalCount' : 12
    },  
]

【问题讨论】:

    标签: javascript arrays underscore.js lodash


    【解决方案1】:

    首先groupBy userId 然后map 组以获得所需的结构:

        var groups = _.groupBy(list, 'userId');
    
        var result = _.map(groups, function(user){
            return {
                userId: user[0].userId,
                userName: user[0].userName,
                purchases: _.map(user, function(purchase){
                    return {
                        category: purchase.category,
                        count: purchase.count
                    }
                }),
                totalCount: _.reduce(user, function(memo, purchase){
                    return memo + purchase.count;
                }, 0)
            }
        });
    

    【讨论】:

      【解决方案2】:

      您可以使用Alasql JavaScript SQL 库来做到这一点:

      这是一个例子:

      var res = alasql('SELECT userId, FIRST(userName) as userName, \
                           ARRAY({category:category,[count]:[count]}) AS purchases,\
                           SUM([count]) AS totalCount FROM ? GROUP BY userId',[data]);
      

      试试这个例子at jsFiddle。将速度与 Lodash 的解决方案 at jsPerf 进行比较。

      评论:

      1. 我将 [count] 放在方括号中,因为 COUNT 是 SQL 保留关键字
      2. ARRAY() 聚合器生成具有值的数组

      【讨论】:

        猜你喜欢
        • 2022-01-23
        • 1970-01-01
        • 2023-03-14
        • 2018-07-04
        • 1970-01-01
        • 2018-10-21
        • 2011-12-15
        • 1970-01-01
        相关资源
        最近更新 更多