10

アンダースコアの groupBy 関数を ember.js で使用することはできますか?

明らかに機能していない次の試みがあります。

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

次のエラーが表示されます。

オブジェクト App.Activity にはメソッド「get」がありません

ストアには正しいデータがロードされるため、findMany はリモート呼び出しを行いません。

問題は、findMany が返す DS.ManyArray が、おそらく _.groupBy が探しているものとは大きく異なることです。

4

2 に答える 2

8

groupByember-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;
};

今、あなたは呼び出すことができます

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;
};
于 2012-06-05T16:23:38.277 に答える