我试图将可汇总指标压缩到ruby表中的唯一标识符。
我有下表:
[["id1", 123], ["id2", 234], ["id1", 345]]
缩小指标的最有效方法是什么,它将如下所示:
[["id1", 468], ["id2", 234]]
答案 0 :(得分:5)
我认为其他的回答者正在过度思考这个问题。只需一个操作each_with_object
和一个哈希:
metrics = [["id1", 123], ["id2", 234], ["id1", 345]]
metrics.each_with_object(Hash.new(0)) do |(id, val), sums|
sums[id] += val
end
# => {"id1"=>468, "id2"=>234}
如果你想在结尾处使用数组而不是哈希,只需在结果上调用to_a
,但没有令人信服的理由这样做。
答案 1 :(得分:1)
尽可能地浓缩。
array = [["id1", 123],["id2", 234], ["id1", 345]]
array.group_by(&:first).collect{|key,values| [key,values.reduce(0) {|sum,a| sum+a[1]}]}
答案 2 :(得分:1)
summable_metrics = [["id1", 123],["id2", 234], ["id1", 345]]
summable_metrics.group_by(&:first).map do |k, v|
[k, v.map(&:last).reduce(:+)]
end
=> [["id1", 468], ["id2", 234]]