2012-03-31 1 views

risposta

5

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

Si potrebbe anche usare passare una funzione personalizzata, ma in questo caso non è necessaria in quanto la sintassi di scelta rapida dell'attributo sopra funziona bene.

_.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

c'è un modo per impostare viste per ogni gruppo e continua a sincronizzare automaticamente quelle visualizzazioni mentre un modello si sposta da un gruppo all'altro? Ad esempio, se cambio la data su un modello, dovrebbe essere spostato su un altro gruppo e le viste dovrebbero aggiornarsi di conseguenza. Un modo per farlo in modo semi-automatico (magari usando la marionetta) o dovrò farlo manualmente? – ragulka

+3

Questo non funziona per le collezioni reali di backbone, la risposta di bullfrog è corretta. –

10

ThiefMaster risposta è perfettamente valido, ma mi ha causato una certa confusione perché ero alla ricerca di una soluzione per una raccolta backbone.js come indica il titolo.

Se l'oggetto domanda è una collezione di spina dorsale che dobbiamo fare le seguenti operazioni per raggruppare i modelli per data:

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

Spero che aiuta

+0

Questa è anche la risposta effettiva alla domanda posta. – 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

Se si raggruppa una collezione spina dorsale reale puoi utilizzare il gruppo di metodi backboneBy che utilizza implicitamente la funzionalità _groupBy di sottolineatura. Questo è un approccio molto più pulito a mio parere.

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

Questa è la risposta effettiva alla domanda posta. – dcarson

+0

Questa è la risposta che descrive come raggruppare usando il backbone. Le risposte sopra descrivono hot to group usando il carattere di sottolineatura –

+8

Puoi anche usare la scorciatoia: collection.groupBy ('date') – fadomire

0

Per coloro che utilizzano Lodash invece di sottolineatura, è possibile ottenere lo stesso risultato utilizzando la _.method() di accesso,

collection.groupBy(_.method('get', 'date'));