Ruby,组合数组中的项目?

JP *_*shy 1 ruby arrays

我有一个输出不同数量的数组的方法,如下所示:

[["unidentified object", 50], ["person", 22], ["car", 55], ["SUV", 32], ["large_vehicle", 76]] 
[["unidentified object", 167], ["person", 104], ["car", 265], ["SUV", 129], ["large_vehicle", 355]] 
[["unidentified object", 1963], ["person", 413], ["car", 1962], ["SUV", 996], ["large_vehicle", 2027]] 
[["unidentified object", 1526], ["person", 373], ["car", 1560], ["SUV", 765], ["large_vehicle", 1706]] 
[["unidentified object", 1234], ["person", 316], ["car", 1705], ["SUV", 895], ["large_vehicle", 1712]]
Run Code Online (Sandbox Code Playgroud)

但是,我真的希望有一个散列,其中包含所有数组中每个项目的总计,例如:

[{:class => "unidentified object", :count => 7234}, {:class => "person", :count => 5231}, {...}]
Run Code Online (Sandbox Code Playgroud)

那有意义吗?我完全需要了解数组和哈希方法的工作原理,但任何提示都会有所帮助.

The*_*heo 5

这应该做的伎俩:

data = [
  [["unidentified object", 50], ["person", 22], # ...
  # ...
]

pairs = data.flatten(1)
grouped_by_class = pairs.group_by(&:first)
output = grouped_by_class.map do |cls, list| 
  {:class => cls, :count => list.map(&:last).inject(&:+)}
end
Run Code Online (Sandbox Code Playgroud)

除非你有充分的理由希望输出完全像你描述的那样,我建议你选择更简单的东西{'unidentified object' => 7234, ...},你可以用这段代码作为输出:

data.flatten(1).inject(Hash.new(0)) do |h, (cls, count)|
  h[cls] += count
  h
end
Run Code Online (Sandbox Code Playgroud)