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