2014-08-28 14 views
25

Tôi đang cố gắng để nhóm các mảng sau đây với các đối tượng:Nhóm bởi giá trị nhiều Underscore.JS nhưng giữ khóa và giá trị

[ { 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 } ] 

Như bạn có thể nhìn thấy nó chứa user_id và alert_id kết hợp, mà tôi muốn nhóm. Vì vậy, tôi muốn có mảng sau:

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

Bất kỳ ai biết giải pháp cho điều này? Với GroupBy của underscore tôi có thể nhóm các giá trị dựa trên một khóa. Nhưng tôi cần phải nhóm chúng, dựa trên sự kết hợp user_id AND alert_id, như bạn có thể thấy.

Tôi đã xem underscore.nest, nhưng vấn đề là nó tạo khóa riêng.

Trả lời

68

Sử dụng groupBy với chức năng tạo khóa tổng hợp bằng user_id và alert_id. Sau đó, lập bản đồ cho các nhóm để có được những gì bạn muốn:

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') 
     } 
    }); 
+0

Hoạt động rất tốt! Cảm ơn bạn! –

+4

Cảm ơn bạn đã viết mã sạch và dễ đọc. – digz6666

+0

Giải quyết được sự cố của tôi, cảm ơn. Chỉ cần thêm vào điều này. Tôi chỉ trả lại các phím như các lĩnh vực riêng biệt và toàn bộ nhóm cho một lĩnh vực, hoạt động rực rỡ với các bộ lặp góc của tôi. – punkologist

Các vấn đề liên quan