2014-08-28 18 views
25

Próbuję grupy następującą tablicę z obiektami:Grupa przez wiele wartości underscore.js ale zachować klucze i wartości

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

Jak widać zawiera user_id i alert_id kombinacje, które lubię Grupa. Chciałbym mieć następującą tablicę:

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

Ktoś zna rozwiązanie tego problemu? Z podkresleniem GroupBy mogę pogrupować wartości na podstawie jednego klucza. Ale muszę je pogrupować, na podstawie kombinacji id_użytkownika ORAZ alert_id, jak widać.

Spojrzałem na underscore.nest, ale problem polega na tym, że tworzy on własne klucze.

Odpowiedz

68

Użyj funkcji groupBy za pomocą funkcji, która tworzy klucz złożony, używając identyfikatora użytkownika i identyfikatora alertu. Następnie mapuj w grupach, aby uzyskać to, co chcesz:

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

Działa bardzo dobrze! Dziękuję Ci! –

+4

Dziękujemy za czysty i czytelny kod. – digz6666

+0

Rozwiązałem mój problem, dziękuję. Wystarczy dodać do tego. Właśnie zwróciłem klucze jako oddzielne pola i całą grupę dla jednego pola, wspaniale współpracuje z moimi replikatorami angularjs. – punkologist