2012-06-05 15 views
10

¿Es posible utilizar la función groupBy de underscore con ember.js?Usando underscore.js groupBy con Ember.js

Tengo el siguiente intento, que es, obviamente, no funciona:

var activities = App.store.findMany(App.Activity, feed.mapProperty('id').uniq()) 
var grouped = _.groupBy(activities, function(activity){ 
    return activity.get('dateLabel;') 
}); 

me sale el siguiente error:

Object App.Activity has no method 'get'

La tienda se carga con los datos correctos de modo findMany no hará un control remoto llamada.

El problema es que findMany devuelve un DS.ManyArray que es probablemente muy diferente de lo que _.groupBy está buscando.

+0

Underscore funciona con cualquier objeto que esté en la matriz 'activities'. Si estos objetos no tienen el método 'get()', entonces el guión bajo no tiene nada que ver con eso. – Tomalak

+0

Creo que el problema es que estos son objetos de DS-ManyArray de datos de color ámbar y son muy diferentes de lo que _.groupBy está buscando. – dagda1

+0

'_.groupBy()' no tiene nada que ver con eso. Si puede hacer 'activities [0] .get ('dateLabel')', también podrá hacer 'activity.get ('dateLabel')' en la devolución de llamada 'groupBy()'. – Tomalak

Respuesta

8

Se podría implementar su propia función groupBy adaptado para brasa objetos de datos DS-ManyArray y extender _ con él:

_.emberArrayGroupBy = function(emberArray, val) { 
    var result = {}, key, value, i, l = emberArray.get('length'), 
     iterator = _.isFunction(val) ? val : function(obj) { return obj.get(val); }; 

    for (i = 0; i < l; i++) { 
    value = emberArray.objectAt(i); 
    key = iterator(value, i); 
    (result[key] || (result[key] = [])).push(value); 
    } 
    return result; 
}; 

Ahora se puede llamar

var grouped = _.emberArrayGroupBy(activities, function(activity) { 
    return activity.get('dateLabel'); 
}); 

o más simplemente

var grouped = _.emberArrayGroupBy(activities, 'dateLabel'); 

La anterior función se basa en groupBy() aplicación original del guión, que es muy similar:

_.groupBy = function(obj, val) { 
    var result = {}; 
    var iterator = _.isFunction(val) ? val : function(obj) { return obj[val]; }; 
    each(obj, function(value, index) { 
    var key = iterator(value, index); 
    (result[key] || (result[key] = [])).push(value); 
    }); 
    return result; 
}; 
0

probar este Código:

var activities = App.store.findMany(App.Activity, feed.mapProperty('id').uniq()) 
var grouped = _.groupBy(activities, function(activity){ 
    return activity.get('dateLabel;') 
}).bind(this); 

no se ha ejecutado el código para probar cómo funciona, pero la idea es "unir" el alcance externo al alcance de la función de cierre interno. Espero que esto ayude a obtener algunas ideas ...