如何使用underscore.js和。打印主干集合项的Count,Sum

时间:2013-07-01 09:40:25

标签: backbone.js underscore.js grouping

我有以下

 var cart= [{ item: "A", price: 2 },
             { item: "B", price: 3 },
             { item: "A", price: 2 },
             { item: "C", price: 5 },
             { item: "C", price: 5 },
             { item: "A", price: 2 }];

现在我想输出像。

Item   Price   Qty   Total
A      2       3     6    
B      3       1     3
C      5       2     10

3 个答案:

答案 0 :(得分:1)

对于给定的item

var sub = myCollection.where({item: item}),
    length = sub.length,
    total = _.reduce(sub, function(memo, num){ return memo + num; }, 0);

如果您想对所有商品执行此操作,但他们可以使用无限数量的值,我建议先对您的收藏品进行排序,然后循环查找找到的值。

答案 1 :(得分:1)

您可以使用_.reduce构建所需的对象

var reduced = _.reduce(cart, function(merged, object, index){ 
    merged[object.item] = merged[object.item] || {};
    merged[object.item] = {
        item: object.item,
        price: object.price,
        qty: (merged[object.item].qty || 0) + 1,
        total: (merged[object.item].total || 0) + object.price
    }
    return merged;
}, {});

这将为您提供以下内容,它可用于构建表

{
    "A": {
        "item": "A",
        "price": 2,
        "qty": 3,
        "total": 6
    },
    "B": {
        "item": "B",
        "price": 3,
        "qty": 1,
        "total": 3
    },
    "C": {
        "item": "C",
        "price": 5,
        "qty": 2,
        "total": 10
    }
}

没有必要使用_.reduce功能。您可以使用任何映射函数或each循环来获得相同的结果。如果您需要一个数组作为最终结果,请修改此代码。

答案 2 :(得分:0)

我使用了以下

var groups = _.groupBy(cartCollection, function(model){
                return model.get('item');
            });
            _.each(groups,function(group){
                console.log('Item: ' + group[0].get("item") + ', Price: ' + group[0].get("price") + ', Qty: ' + group.length + ', Total: ' + (group[0].get("price") * group.length));
            });

现在输出

enter image description here