使用underscore.js groupBy和Ember.js

dag*_*da1 10 underscore.js ember.js

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

我有以下尝试,显然不起作用:

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

我收到以下错误:

对象App.Activity没有方法'get'

商店加载了正确的数据,因此findMany不会进行远程调用.

问题是findMany返回的DS.ManyArray可能与_.groupBy正在寻找的东西有很大的不同.

Tom*_*lak 8

您可以groupBy为ember-data DS-ManyArray对象实现自己的功能,并随之扩展_:

_.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;
};
Run Code Online (Sandbox Code Playgroud)

现在你可以打电话了

var grouped = _.emberArrayGroupBy(activities, function(activity) {
  return activity.get('dateLabel');
});
Run Code Online (Sandbox Code Playgroud)

或者更简单

var grouped = _.emberArrayGroupBy(activities, 'dateLabel');
Run Code Online (Sandbox Code Playgroud)

上面的函数基于下划线的原始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;
};
Run Code Online (Sandbox Code Playgroud)