如何求和
[["a", 1], ["b", 2], ["c", 3], ["a", 20], ["b", 12], ["c", 5]]
到
[["a", 21], ["b", 14], ["c", 8]]
我不明白如何按键组合数组映射和在这些键中按值注入(&:+)
答案 0 :(得分:6)
.group_by(&:first).map { |k, v| [k, v.map(&:last).inject(:+)] }
答案 1 :(得分:2)
x = [["a", 1], ["b", 2], ["c", 3], ["a", 20], ["b", 12], ["c", 5]]
y = Hash.new(0)
x.each {|a| y[a[0]] += a[1]}
y.to_a
=> [["a", 21], ["b", 14], ["c", 8]]
答案 2 :(得分:2)
我的功能性解决方案
array = [["a", 1], ["b", 2], ["c", 3], ["a", 20], ["b", 12], ["c", 5]]
array.group_by do |a|
a.first
end.map do |k, v|
[k, v.reduce(0) { |acc, (l, r)| acc + r }]
end
# => [["a", 21], ["b", 14], ["c", 8]]
答案 3 :(得分:2)
arr = [["a", 1], ["b", 2], ["c", 3], ["a", 20], ["b", 12], ["c", 5]]
arr.each_with_object(Hash.new(0)) { |x,hsh| hsh[x[0]] += x[1] }.to_a
# => [["a", 21], ["b", 14], ["c", 8]]
答案 4 :(得分:2)
arr = [["a", 1], ["b", 2], ["c", 3], ["a", 20], ["b", 12], ["c", 5]]
arr.group_by(&:first).map { |k,v| [k,v.transpose.last.reduce(:+)]}
#=> [["a", 21], ["b", 14], ["c", 8]]