2012-06-05 32 views
10

是否可以在ember.js中使用下划线的groupBy函数?使用underscore.js groupBy与Ember.js

我有以下尝试这显然是不工作:

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

我收到以下错误:

Object App.Activity has no method 'get'

该店装有正确数据,因此findMany不会使远程呼叫。

问题是,findMany返回一个DS.ManyArray,它可能与_.groupBy正在查找的内容有很大不同。

+0

下划线可以处理'活动'数组中的任何对象。如果这些对象没有'get()'方法,则下划线与它无关。 – Tomalak

+0

我认为问题在于这些是ember-data DS-ManyArray对象,与_.groupBy正在寻找的内容有很大不同。 – dagda1

+0

'_.groupBy()'根本就没有任何关系。如果您可以执行'activities [0] .get('dateLabel')',那么也可以在'groupBy()'回调中执行'activity.get('dateLabel')'。 – Tomalak

回答

8

您可以实现对烬数据DS-ManyArray对象自己groupBy功能定制,并把它扩展_

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

现在,您可以拨打

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

或者更简单地说

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

上述

该功能是基于下划线的原始groupBy()执行,这看起来非常相似:

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

试试这个代码:

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

我没有运行此代码来测试它是如何工作的,但这个想法是将外部范围'绑定'到内部的闭包函数范围中。 希望这有助于让你有一些想法...