0

我有以下

 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
4

3 回答 3

1

对于给定的item

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

如果您想对所有项目执行此操作,但它们可以采用无限数量的值,我建议您先对您的集合进行排序,然后遍历找到的值。

于 2013-07-01T10:11:20.227 回答
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循环来获得相同的结果。如果您需要一个数组作为最终结果,请修改此代码。

于 2013-07-01T10:27:34.550 回答
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));
            });

现在输出将是

在此处输入图像描述

于 2013-07-01T10:21:09.407 回答