如何总结嵌套数组中的值

Joh*_*ith 0 ruby

我有一个以下格式的数组:

arr = [
 ["OMAA002S16001006 1088", 13],
 ["OMAA002S16001006 1088", 13],
 ["OMAA002S16001006 1088", 10],
 ["OMRA001S16116037 1001", 10],
 ["OMRA001S16116037 0110", 9],
 ["OMAA002S16001014 0119", 9],
 ["OMAA002S16001002 0134", 9]
]
Run Code Online (Sandbox Code Playgroud)

第一个条目是相同的代码,但具有不同的数字.什么是使条目独特并总结右边值的最佳方法?结果应该是这样的:

[
 ["OMAA002S16001006 1088", 36],
 ["OMRA001S16116037 1001", 10],
 ["OMRA001S16116037 0110", 9],
 ["OMAA002S16001014 0119", 9],
 ["OMAA002S16001002 0134", 9]
]
Run Code Online (Sandbox Code Playgroud)

Ste*_*fan 8

使用Enumerable#each_with_object:

arr.each_with_object(Hash.new(0)) { |(k, v), h| h[k] += v }
#=> {"OMAA002S16001006 1088"=>36,
#    "OMRA001S16116037 1001"=>10,
#    "OMRA001S16116037 0110"=>9,
#    "OMAA002S16001014 0119"=>9,
#    "OMAA002S16001002 0134"=>9}
Run Code Online (Sandbox Code Playgroud)

您可以调用to_a将其转换回数组.


Dog*_*ert 5

使用group_by,mapreduce:

arr.group_by(&:first).map { |k, v| [k, v.map(&:last).reduce(:+)] }
#=> [["OMAA002S16001006 1088", 36],
#    ["OMRA001S16116037 1001", 10],
#    ["OMRA001S16116037 0110", 9],
#    ["OMAA002S16001014 0119", 9],
#    ["OMAA002S16001002 0134", 9]]
Run Code Online (Sandbox Code Playgroud)