2012-03-31 16 views

Odpowiedz

5

Zastosowanie _.groupBy(data, 'date');

Można również użyć przekazać funkcję niestandardową, ale w tym przypadku nie jest to konieczne, ponieważ powyżej składnia skrót atrybut działa dobrze.

_.groupBy(data, function(row) { 
    return row.date; 
}); 

Demo:

> _.groupBy(data, 'date') 
{ 'Thu Mar 29 2012': [ { name: 'Bob', date: 'Thu Mar 29 2012' } ], 
    'Fri Mar 30 2012': 
    [ { name: 'James', date: 'Fri Mar 30 2012' }, 
    { name: 'Dylan', date: 'Fri Mar 30 2012' } ], 
    'Sat Mar 31 2012': [ { name: 'Stanley', date: 'Sat Mar 31 2012' } ] } 
> _.groupBy(data, function(row) { return row.date }); 
{ 'Thu Mar 29 2012': [ { name: 'Bob', date: 'Thu Mar 29 2012' } ], 
    'Fri Mar 30 2012': 
    [ { name: 'James', date: 'Fri Mar 30 2012' }, 
    { name: 'Dylan', date: 'Fri Mar 30 2012' } ], 
    'Sat Mar 31 2012': [ { name: 'Stanley', date: 'Sat Mar 31 2012' } ] } 
> 
+2

Czy istnieje sposób, aby utworzyć widoki dla każdej grupy i automatycznie synchronizuj te widoki, gdy jeden model przechodzi z jednej grupy do drugiej? Na przykład, jeśli zmienię datę w modelu, powinien on zostać przeniesiony do innej grupy, a widoki będą musiały zostać odpowiednio zaktualizowane. Jakikolwiek sposób to zrobić półautomatycznie (być może przy użyciu marionetki) lub czy będę musiał to zrobić ręcznie? – ragulka

+3

To nie działa w przypadku rzeczywistych zbiorów kręgosłupa, odpowiedź żaby ryczącej jest poprawna. –

10

ThiefMaster odpowiedź jest całkowicie poprawny, ale sprawiało mi to pewne zamieszanie, ponieważ szukałem rozwiązania dla kolekcji backbone.js jak wskazuje tytuł.

Jeśli obiekt pytanie jest zbiorem kręgosłup należy wykonać następujące czynności do grupy modeli wg daty:

_.groupBy(collection.models, function(model){ 
    return model.get('date') 
}); 

Mam nadzieję, że to pomaga

+0

To jest również odpowiedź na zadane pytanie. – dcarson

4
var groups =collection.groupBy(function(model) { return model.get('date'); }); 

//iterate over groups 
for(date in groups) { 
    var models = groups[date]; 
    console.log('date: '+date); 
    for (var model_idx in models) { 
     console.log(' name: '+ models[model_idx].get('name')); 
    } 
} 
47

Jeśli grupowanie rzeczywisty zbiór szkieletowej możesz użyć grupy szkieletu groupBy, która domyślnie używa funkcji podkreślenia _.groupBy. To moim zdaniem zdecydowanie czystsze podejście.

collection.groupBy(function(model){ 
    return model.get('date'); 
}); 
+1

To jest odpowiedź na zadane pytanie. – dcarson

+0

To jest odpowiedź opisująca sposób grupowania za pomocą szkieletu. Powyższe odpowiedzi opisują gorąco w grupie, używając podkreślenia –

+8

Można nawet użyć skrótu: collection.groupBy ('date') – fadomire

0

Dla osób korzystających Lodash zamiast podkreślenia, można osiągnąć ten sam rezultat używając _.method() akcesor,

collection.groupBy(_.method('get', 'date')); 
Powiązane problemy