使用骨干集合对报告进行分组和聚合

时间:2014-05-23 14:32:55

标签: javascript backbone.js marionette

我在骨干模型和收集表格中有以下信息:

// 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失败了。任何帮助表示赞赏,

非常感谢您的支持

1 个答案:

答案 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相加,并使用新值。

希望这会有所帮助!