聪明的方法从阵列哈希中获得每组的第二项?

时间:2012-11-02 22:51:50

标签: ruby

使用手动循环和结果数组可以轻松解决问题,您可以随时添加。但是我正在寻找一个更加红宝石般的解决方案,可能是使用注入或选择的东西。这就是问题所在:

arr_of_hashes = [
  {id: 1, val: "blah1"},
  {id: 1, val: "blah2"},
  {id: 1, val: "blah3"},
  {id: 2, val: "blah4"},
  {id: 2, val: "blah5"},
  {id: 3, val: "blah6"},
  {id: 3, val: "blah7"},
  {id: 3, val: "blah8"},
  {id: 3, val: "blah9"}
]

"组"由" id"定义哈希中的字段。我们保证每个小组至少有两个项目。我们想要返回一个包含每组第二项的数组:

output_should_be = [
  {id: 1, val: "blah2"},
  {id: 2, val: "blah5"},
  {id: 3, val: "blah7"}
]

2 个答案:

答案 0 :(得分:4)

“我正在寻找一种更加红宝石般的解决方案”。我想你的意思是functional

arr_of_hashes.chunk { |h| h[:id] }.map { |id, hs| hs[1] }
#=> [{:id=>1, :val=>"blah2"}, {:id=>2, :val=>"blah5"}, {:id=>3, :val=>"blah7"}]

如果元素未按 id 预先订购,请使用group_by

答案 1 :(得分:1)

以下是使用group_by的解决方案:

arr_of_hashes.group_by{|h| h[:id]}.to_a.map{|id,a| a[1]}