2014-09-04 60 views
0

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

回答

1

首先groupBy用户id,然后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) 
     } 
    }); 
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()聚合产生具有值的数组