使用underscore.js groupBy与Ember.js

前端之家收集整理的这篇文章主要介绍了使用underscore.js groupBy与Ember.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正在寻找的不同.

解决方法

您可以为ember-data 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;
};

猜你在找的JavaScript相关文章