我想知道是否有一個很好的fold
(或地圖,減少等)風格的解決方案來解決這個問題。聚合項目清單並收集總計的最佳方式
給出一個採購集合(order_items)我想收集每個產品/ sku的總計。
實例集合:
[{sku: "A", price:10},
{sku: "B", price:5},
{sku: "C", price:2},
{sku: "B", price:5},
{sku: "A", price:10},
{sku: "B", price:5}]
而得到的結果是:
{"A":20, "B":15, "C":2}
目前我做它像這樣:
aggregate = order_items.each_with_object({}){|i,o|
o[i[:sku]] ||= 0
o[i[:sku]] += i[:price]
}
這給了我什麼,我想要的,但我想知道是否有更優雅的方式來做到這一點?
顯然,如果我預過濾到一個單一的SKU我可以做一個經典的reduce
即。
# assuming sku is a flat array of values for a single sku type...
aggregate_sku = sku.reduce(:+)
但是,我不想預先過濾原始集合。有沒有辦法做到這一點,或者我已經在盡一切可能?
任何幫助表示讚賞。
修改以增加問題的清晰度。如果您覺得需要投票結束,請先發表評論,以便澄清。
潛臺詞:我不確定map
,reduce
等等是否有我還不明白的功能(或更可能的技術),謝謝。
對那些投票結束這一點,並不清楚我在問什麼......:我想知道是否有更好的解決方案來解決這個問題。可能使用'map'(etc.) – ocodo
我會使用'inject'而不是'each_with_object',但除此之外,您的解決方案至少應該是最快的:) – tessi
@tessi我試着用'reduce'(a 'inject'的註釋名),但我無法弄清楚什麼是錯誤的,你能發表一個答案嗎? – ocodo