我在骨干模型和收集表格中有以下信息:
// Sales model has this type of data
var SalesModel = Backbone.Model.extend({
defaults:{
item: "",
amount: 0
}
});
// Sales collection has this type of data
var SalesCollection = Backbone.Collection.extend({model:SalesModel});
var salesList = new SalesCollection([
new SalesModel({item: "Icecream", amount: 1}),
new SalesModel({item: "Pop", amount: 2}),
new SalesModel({item: "Pop", amount: 4}),
new SalesModel({item: "Candy", amount: 1}),
new SalesModel({item: "Pop", amount: 6}),
new SalesModel({item: "Candy", amount: 3}),
new SalesModel({item: "Chips", amount: 7}),
new SalesModel({item: "Corndog", amount: 6}),
]);
我正在尝试使用' groupBy'也许'减少'为这样的视图创建一个新集合:
ITEM |出售
冰淇淋| 1
流行| 12
糖果| 4
芯片| 7
Corndog | 1
因此,您可以看到数据已经汇总并且#39;取出重复但总计完成。我怎么能接近这个?我一直试图像这样使用groupBy:
groupedSalesList = salesList.groupBy(function(ss){
return this.get('item')
});
但这在jsfiddle失败了。任何帮助表示赞赏,
非常感谢您的支持答案 0 :(得分:0)
首先我想提一下,当您创建/初始化SalesCollection
时,您只需传递一个对象数组,并且集合将自动为您创建SalesModel
模型,因为您已经定义了它:
var SalesCollection = Backbone.Collection.extend({model:SalesModel});
关于您拥有无效groupBy声明的代码的第二个注释。 而不是:
groupedSalesList = salesList.groupBy(function(ss){
return this.get('item') // here 'this' reference is window, see example
});
分组只会返回一个不是Backbone.Collection
您应该使用:
groupedSalesList = salesList.groupBy(function(model, index, collection){ return model.get('item') });
检查下划线中的groupBy。
此处为您的问题解决方案 - jsFiddle。
在这里,我建议您在实际创建Backbone集合之前过滤对象集合。我想这些数据将从服务器中检索出来,你可以重写Backbone的集合解析(resp,options) - (参见Backbone的注释源代码)方法,用于在需要时重新格式化你的响应。 / p>
以下是您案例的groupByMax()
函数
var groupBySum = function (collection, groupBy, max) { map = collection.reduce(function(memo, item, index, array){ memo[item[groupBy]] = (memo[item[groupBy]] || 0) + item[max]; return memo; }, {}); return _.map(map, function(num, key) { var result = {}; result[groupBy] = key; result[max] = num; return result; }); };
collection
这是一个不是Backbone.Collection
的对象数组。
如果您想使用Backbone.Collection
,可以使用groupBy
将值与reset()
Backbone.Collection
相加,并使用新值。
希望这会有所帮助!