Использование 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;')
});

Я получаю следующую ошибку:

Объект App.Activity не имеет метода 'get'

В хранилище загружены правильные данные, поэтому findMany не будет выполнять удаленный вызов.

Проблема заключается в том, что findMany возвращает DS.ManyArray, который, вероятно, сильно отличается от того, что ищет _.groupBy.

Ответ 1

Вы можете реализовать свою собственную функцию groupBy, адаптированную для объектов DS-ManyArray для ember-data, и продлить ее с помощью _:

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

Ответ 2

Попробуйте этот код:

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

Я не запускал этот код, чтобы проверить, как он работает, но идея состоит в том, чтобы "привязать" внешнюю область к внутренней области функции закрытия. Надеюсь, это поможет вам получить некоторые идеи...