Javascript 带子数组的组数组

Javascript 带子数组的组数组,javascript,arrays,underscore.js,lodash,Javascript,Arrays,Underscore.js,Lodash,我试图找到一种最简单的方法来获取一个具有相似信息的数组,并使用子数组创建一个数组。新创建的父数组还应与子数组中的值求和。这相当于使用sum/group by的SQL语句 这是原始数组 [ { 'userId':1, 'userName':'bob', 'category':'shoes', 'count':2 }, { 'userId':1, 'userName':'bob',

我试图找到一种最简单的方法来获取一个具有相似信息的数组,并使用子数组创建一个数组。新创建的父数组还应与子数组中的值求和。这相当于使用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
    },  
]
首先是用户ID,然后是获得所需结构的组:

    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)
        }
    });
您可以使用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]);
试试这个例子。将速度与Lodash溶液进行比较

评论:

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