2012-03-31 14 views
8

Una colección de ejemplo (mostrando en algunos modelos):¿Cómo se usa groupBy en Backbone.js para agrupar colecciones?

[ 
    { 
     name: "Bob" 
     date: "Thu Mar 29 2012" 
    }, 
    { 
     name: "James" 
     date: "Fri Mar 30 2012" 
    }, 
    { 
     name: "Dylan" 
     date: "Fri Mar 30 2012" 
    }, 
    { 
     name: "Stanley" 
     date: "Sat Mar 31 2012" 
    }, 
] 

¿Cómo puedo utilizar la función GroupBy Underscore.js' a los modelos de grupo con la misma fecha?

+1

se le olvidó la comas antes de 'date:' – ThiefMaster

Respuesta

5

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

También es posible usar aprobar una función personalizada, pero en este caso no es necesario ya que la sintaxis abreviada atributo anterior funciona correctamente.

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

Demostración:

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

¿Hay una manera de configurar vistas para cada grupo y sincronizar automáticamente esas vistas a medida que un modelo se mueve de un grupo a otro? Por ejemplo, si cambio la fecha en un modelo, debería moverse a otro grupo y las vistas tendrían que actualizarse en consecuencia. ¿Alguna forma de hacerlo de forma semiautomática (quizás usando Marionette) o tendré que hacer esto manualmente? – ragulka

+3

Esto no funciona para las colecciones principales reales, la respuesta de bullfrog es correcta. –

10

ThiefMaster respuesta es perfectamente válido, pero me causó cierta confusión porque yo estaba buscando una solución para una colección Backbone.js como indica el título.

Si el objeto pregunta es una colección columna vertebral que debemos hacer lo siguiente al grupo de los modelos por fecha:

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

espero que ayude

+0

Esta es también la respuesta real a la pregunta. – 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

Si está agrupando una colección columna vertebral real puede usar el grupo de métodos backboneBy que utiliza de forma implícita la funcionalidad _.groupBy de subrayado. Este es un enfoque mucho más limpio en mi opinión.

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

Esta es la respuesta real a la pregunta hecha. – dcarson

+0

Esta es la respuesta que describe cómo agrupar utilizando la red troncal. Las respuestas anteriores describen hot to group usando underscore –

+8

Incluso podría usar la abreviatura: collection.groupBy ('date') – fadomire

0

Para aquellos que utilizan Lodash vez de subrayado, se puede lograr el mismo resultado utilizando el descriptor de acceso _.method(),

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