Ember.js:将模型记录汇总为一个记录

Ember.js:将模型记录汇总为一个记录,ember.js,ember-data,Ember.js,Ember Data,我想我已经用reduce()解决了这个问题,但问题是我需要在每条记录上汇总多个属性,所以每次我返回一个对象时,我遇到的问题是previousValue是一个余烬对象,而我返回的是一个普通对象,所以它在第一个循环中运行良好,但是第二次通过时,a不再是余烬对象,因此我得到一个错误,说a.get不是函数。示例代码: /* filter the model to get only one food category, which is determined by the user selecting a

我想我已经用
reduce()
解决了这个问题,但问题是我需要在每条记录上汇总多个属性,所以每次我返回一个对象时,我遇到的问题是
previousValue
是一个余烬对象,而我返回的是一个普通对象,所以它在第一个循环中运行良好,但是第二次通过时,
a
不再是余烬对象,因此我得到一个错误,说
a.get不是函数。示例代码:

/*
filter the model to get only one food category, which is determined by the user selecting a choice that sets the property: theCategory 
*/
var foodByCategory = get(this, 'model').filter(function(rec) {
  return get(rec, 'category') === theCategory;
});

/*
Now, roll up all the food records to get a total
of all cost, salePrice, and weight
*/
summary = foodByCategory.reduce(function(a,b){
  return {
    cost: a.get('cost') + b.get('cost'),
    salePrice: a.get('salePrice') + b.get('salePrice'),
    weight: a.get('weight') + b.get('weight')
  };
});
我这样做完全错了吗?是否有更好的方法将多个记录从
模型
汇总到一个记录中,或者我只需要先将模型记录展平为普通对象,或者在
reduce()中返回一个余烬对象

Edit:doing
return-Ember.Object.create({…})
确实有效,但我仍然想知道这是否是实现目标的最佳方式,或者Ember是否提供了可以实现这一目标的函数,如果是的话,它们是否比
reduce
假设
this.get('model')更好
返回一个
余烬。可枚举的
,您可以使用而不是
过滤器

var foodByCategory = get(this, 'model').filterBy('category', theCategory);
至于您的
reduce
,我不知道有任何余烬内置可以改进它。我能想到的最好方法是使用多个独立的
mapBy
reduce
调用:

summary =  {
  cost: foodByCategory.mapBy('cost').reduce(...),
  salePrice: foodByCategory.mapBy('salePrice').reduce(...),
  ...
};

但这可能表现得不太好。我不会太担心使用Ember内置来进行标准数据操作。。。据我所知,大多数余烬项目仍然在余烬本身的旁边使用一个实用程序库(如Lodash),这样在编写这种数据转换时通常会更加有效

你在使用余烬数据吗?@locks:在我的控制器中。我同意使用纯JavaScript来汇总数据。在您看来,
reduce()
是最好的方法吗?本质上,我正在尝试创建一个新的模型,其中包含一条记录。我还在汇总属性的基础上,将其他属性添加到
summary
。我是否应该在路线中执行此操作,在那里按类别上卷,然后在控制器中按
filterBy
进行过滤?@redOctober13取决于您所说的“最佳”是什么意思
reduce
绝对是一个很好的方法。我不确定我是否有足够的上下文来说明什么最适合您的情况,但听起来“摘要”在您的应用程序中是一流的对象,即使它不是模型。我会考虑创建一个概要“类”作为代码> const汇总=烬.Obj.OpDelphi({…<代码/代码>),这样您就可以用一种更为面向对象的方式定义计算属性。然后,您可以做一些类似于<代码>概要=摘要.CREATE(FoeByType…
,其中您的
reduce
返回一个POJO。如果我的评论不清楚,请告诉我。@redOctober13哦,还有一件事:您可能会发现(
Ember.get(obj,key)
)有用:它对POJO和
Ember.Object
都有效。