从Hash中删除重复项

时间:2016-06-01 12:54:28

标签: arrays ruby hash unique

我有以下哈希数组

input = [
  {'line_number' => 1, 'name' => 'Name1', 'value' => 'Value'},
  {'line_number' => 1, 'name' => 'Name2', 'value' => 'Value'},
  {'line_number' => 2, 'name' => 'AnotherName', 'value' => 'AnotherValue'}
]

我想,在检查唯一性之后,输出将是

output = [
  {'line_number' => 1, 'name' => 'Name2', 'value' => 'Value'},
  {'line_number' => 2, 'name' => 'AnotherName', 'value' => 'AnotherValue'}
]

因为简单的唯一性

input.uniq! { |i| i['line_number'] }
给我

output = [
  {'line_number' => 1, 'name' => 'Name1', 'value' => 'Value'},
  {'line_number' => 2, 'name' => 'AnotherName', 'value' => 'AnotherValue'}
]

提前致谢。

4 个答案:

答案 0 :(得分:1)

如果你想保留最后一个,你可以这样做

input.each_with_object({}) {|h, obj| obj[h['line_number']] = h}.values
# => [{"line_number"=>1, "name"=>"Name2", "value"=>"Value"},
# =>  {"line_number"=>2, "name"=>"AnotherName", "value"=>"AnotherValue"}]

答案 1 :(得分:0)

非常奇怪的问题,但是,也许,它可以帮到你:

input.group_by { |i| i['line_number'] }.values.map! { |i| i.last }

答案 2 :(得分:0)

如果你想保留最后一个而不是第一个,为什么不简单

input.reverse.uniq { |i| i['line_number'] }

答案 3 :(得分:0)

input.each_with_object({}) { |g,h| h.update(g['line_number']=>g) }.values
  #=> [{"line_number"=>1, "name"=>"Name2", "value"=>"Value"},
  #    {"line_number"=>2, "name"=>"AnotherName", "value"=>"AnotherValue"}]