2014-02-13 52 views
2

相關給出的這個「樣本收集數據」這question骨幹集合:抓取集合的不同的值,總結了不同的值

[{brand:'audi', amount: '100.16', id:'1234'}, 
{brand:'audi', amount: '67.84', id:'3456'}, 
{brand:'bmw', amount: '80.70', id:'3456'}] 

我怎麼可以添加不同品牌的量從集合?

,並得到這樣的數據:

[{brand:'audi', amount: '168.00'}, 
{brand:'bmw', amount: '80.70'}] 

在此先感謝傢伙!

回答

3

這是一個非常標準的reduce這還只是直接的JavaScript:

var o = data.reduce(function(m, e) { 
    // There are lots of ways to do this depending on what sorts 
    // of things are going to be values in `m`, we're expecting 
    // the values to be non-zero numbers so a simple `!` is fine. 
    if(!m[e.brand]) 
     m[e.brand] = 0; 
    m[e.brand] += parseFloat(e.amount); 
    return m; 
}, { }); 

如果你擔心石器時代的瀏覽器,然後使用_(data).reduce或一個簡單的循環:

var o = { }, i; 
for(i = 0; i < data.length; ++i) { 
    if(!o[data[i].brand]) 
     o[data[i].brand] = 0; 
    o[data[i].brand] += parseFloat(data[i].amount]); 
} 

你應該只要它們都很小並且像這些一樣靠近在一起,就非常安全並具有浮點值。

+0

的感謝!好主意!我只有在你不使用Backbone Collection時纔有效。 =) – jrsalunga

+0

如果'data'實際上是一個集合而不是數組,那麼你可以使用'data.reduce(...)'。 –

+0

但我得到這個錯誤對象{對象{undefined:NaN}'請檢查這個小提琴的日誌http://jsfiddle.net/jrsalunga/3mk9B/ – jrsalunga

1

該解決方案品牌首創集團的汽車,然後使用好老減少總結金額:

var carsByBrand = _.groupBy(cars, 'brand'); 

var sumAmount = function(total, car){ 
    return total + parseFloat(car.amount); 
} 

var sums = _.map(carsByBrand, function(cars, brand){ 
    return { 
     brand: brand, 
     amount: _.reduce(cars, sumAmount, 0) 
    }; 
}); 
+0

工作不正常 – jrsalunga