Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Group by multiple values Underscore.JS but keep the keys and values

I'm trying to group the following array with objects:

[ { user_id: 301, alert_id: 199, deal_id: 32243 },   { user_id: 301, alert_id: 200, deal_id: 32243 },   { user_id: 301, alert_id: 200, deal_id: 107293 },   { user_id: 301, alert_id: 200, deal_id: 277470 } ] 

As you can see it contains user_id and alert_id combinations, which I like to group. So I would like to have the following array:

[ { user_id: 301, alert_id: 199, deals: [32243] },   { user_id: 301, alert_id: 200, deals: [32243,107293,277470]}] 

Anyone knows a solution for this? With underscore's GroupBy I can group the values based on one key. But I need to group them, based on the combination user_id AND alert_id, as you can see.

I took a look at underscore.nest, but the problem is it creates its own keys.

like image 314
Erik van de Ven Avatar asked Aug 28 '14 13:08

Erik van de Ven


Video Answer


1 Answers

Use groupBy with a function that creates a composite key using user_id and alert_id. Then map across the groupings to get what you want:

    var list = [ { user_id: 301, alert_id: 199, deal_id: 32243 },       { user_id: 301, alert_id: 200, deal_id: 32243 },       { user_id: 301, alert_id: 200, deal_id: 107293 },       { user_id: 301, alert_id: 200, deal_id: 277470 } ];      var groups = _.groupBy(list, function(value){         return value.user_id + '#' + value.alert_id;     });      var data = _.map(groups, function(group){         return {             user_id: group[0].user_id,             alert_id: group[0].alert_id,             deals: _.pluck(group, 'deal_id')         }     }); 
like image 140
Gruff Bunny Avatar answered Oct 09 '22 04:10

Gruff Bunny