按多个值分组Underscore.JS但保留键和值

Eri*_*Ven 33 javascript underscore.js

我正在尝试使用对象对以下数组进行分组:

[ { 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 } ]
Run Code Online (Sandbox Code Playgroud)

如您所见,它包含user_id和alert_id组合,我喜欢将其分组.所以我想拥有以下数组:

[ { user_id: 301, alert_id: 199, deals: [32243] },
  { user_id: 301, alert_id: 200, deals: [32243,107293,277470]}]
Run Code Online (Sandbox Code Playgroud)

有谁知道解决这个问题?使用下划线的GroupBy,我可以根据一个键对值进行分组.但是我需要根据组合user_id AND alert_id对它们进行分组,如您所见.

我看了一下underscore.nest,但问题是它创建了自己的密钥.

Gru*_*nny 86

groupBy与使用user_id和alert_id创建复合键的函数一起使用.然后映射分组以获得您想要的内容:

    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')
        }
    });
Run Code Online (Sandbox Code Playgroud)

  • 它用于从alert_id中分隔user_id,以便groupBy函数中返回的字符串看起来像'301#200'(Javascript会将数字强制转换为字符串).如果没有使用那么该函数将返回例如501(301 + 200)的数字,其可能是不正确的,例如300 + 201 === 400 + 101. (5认同)
  • 我可以问一下数字符号('#')的用途是什么吗? (2认同)