数组是:
arr = [["lorem", 10], ["ipsum", 20], ["lorem", 15], ["dolor", 5], ["dolor", 10] ...]
合并它的好方法是什么:
[["lorem", 25], ["ipsum", 20], ["dolor", 15]]
lorem
中的arr
有10
和15
,因此结果是lorem
25
1}})答案 0 :(得分:1)
这是一个快速的肮脏方式来解决这个问题
net/http
它将复制数组,因为移位是破坏性的,然后它将按照创建arr = [["lorem", 10], ["ipsum", 20], ["lorem", 15], ["dolor", 5], ["dolor", 10]]
arr.dup.group_by(&:shift).map{|k,v|[k,v.flatten.reduce(:+)]}.sort_by{|a|-a.last}
#=>[["lorem", 25], ["ipsum", 20], ["dolor", 15]]
的第一个值进行分组:
Hash
然后它将{"lorem"=>[[10],[15]],"ipsum"=>[[20]],"dolor"=>[[5],[10]]}
并在值数组上调用map
和flatten
。
也可以使用reduce
each_with_object
答案 1 :(得分:0)
或许这样的事情:
arr.group_by { |vals| vals[0] }.map { |(k, v)| [k, v.map { |x| x[1] }.reduce(:+)] }.sort_by { |a| -a[1] }
输出
=> [["lorem", 25], ["ipsum", 20], ["dolor", 15]]
答案 2 :(得分:0)
arr.to_enum.with_object(Hash.new(0)){|(k, v), h| h[k] += v}.sort_by(&:last).reverse
# => [["lorem", 25], ["ipsum", 20], ["dolor", 15]]
答案 3 :(得分:0)
arr.group_by(&:first).map { |k, v| [k, v.map(&:last).reduce(&:+)] }