如何在Ruby中添加哈希并删除重复项?

时间:2017-07-06 11:38:52

标签: ruby hash duplicates

我有一个哈希:

h = { ["alpha"]=>[{  "bit"=>"100", "colour"=>"red"},
                  {   "id"=>"100", "colour"=>"red"},
                  { "value"=>"65", "colour"=>"red"}],
      ["beta"] =>[{   "id"=>"070", "colour"=>"black"},
                  {"value"=>"338", "colour"=>"black"}]
}

我想在值中为自己添加哈希值,并从每个项目中删除重复的对以获取

h = { ["alpha"]=>[{"bit"=>"100", "id"=>"100", "value"=>"65", "colour"=>"red"}],
      ["beta"] =>[{"id"=>"070", "value"=>"338", "colour"=>"black"}]
}

我到目前为止尝试将哈希转换为数组并删除重复但是如何将数组转换为哈希?我也认为这不是有效而优雅的解决方案。还有其他想法吗?

3 个答案:

答案 0 :(得分:6)

Ruby> = 2.4.0 - 方法#transform_values包含方法#inject#merge

h.transform_values { |v| v.inject(:merge) }

对于较低版本:

h.map { |k, v| [k, v.inject(:merge)] }.to_h

答案 1 :(得分:0)

更长的版本,一步一步,看起来像这样:

    h.inject({}) { |result, (key, value)| 
      result[key] = value.inject({}){ |value_result, value_elem| 
            value_result.merge! value_elem; value_result
      }; result 
   }

它基本上将哈希数组(在每个值中)转换为包含唯一值的单个哈希。但要注意 - 如果你有这样的哈希:

h = {
"alpha"=>[{"bit"=>"100", "colour"=>"red"}, {"id"=>"100", "colour"=>"blue"}]
}

对于键“color”有两个不同的值,输出将如下所示:

{"alpha"=>{"bit"=>"100", "colour"=>"blue", "id"=>"100"}}

这就是#merge方法的工作原理。

答案 2 :(得分:0)

这使用Hash#merge的形式来确定合并的两个哈希中存在的键的值,这里是所有键。

h.merge(h) { |_,arr| arr.reduce(&:merge) }
  #=> {["alpha"]=>{"bit"=>"100", "colour"=>"red", "id"=>"100", "value"=>"65"},
  #    ["beta"] =>{"id"=>"070", "colour"=>"black", "value"=>"338"}}