具有子数组的组数组

时间:2014-09-04 22:36:50

标签: javascript arrays underscore.js lodash

我正在尝试找到一种最简单的方法来获取具有类似信息的数组并使用子数组创建数组。新创建的父数组还应该对在子数组中找到的值求和。这相当于使用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
    },  
]

2 个答案:

答案 0 :(得分: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)
        }
    });

答案 1 :(得分:0)

您可以使用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()聚合器生成一个值为
  3. 的数组