Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 删除散列的散列中的重复项_Ruby - Fatal编程技术网

Ruby 删除散列的散列中的重复项

Ruby 删除散列的散列中的重复项,ruby,Ruby,你能给我一个解决以下问题的办法吗 hash_list = { "a"=>{"unit_id"=>"43", "dep_id"=>"153", "_destroy"=>"false"}, "b"=>{"unit_id"=>"43", "dep_id"=>"153", "_destroy"=>"false"}, "c"=>{"unit_id"=>"43", "dep_id"=>"154", "_destroy"=>"

你能给我一个解决以下问题的办法吗

hash_list = {
  "a"=>{"unit_id"=>"43", "dep_id"=>"153", "_destroy"=>"false"},
  "b"=>{"unit_id"=>"43", "dep_id"=>"153", "_destroy"=>"false"},
  "c"=>{"unit_id"=>"43", "dep_id"=>"154", "_destroy"=>"false"},
  "d"=>{"unit_id"=>"42", "dep_id"=>"154", "_destroy"=>"false"}
}
预期输出:应删除所有字段中的重复项

{
  "a"=>{"unit_id"=>"43", "dep_id"=>"153", "_destroy"=>"false"},
  "c"=>{"unit_id"=>"43", "dep_id"=>"154", "_destroy"=>"false"},
  "d"=>{"unit_id"=>"42", "dep_id"=>"154", "_destroy"=>"false"}
}
你可以写

hash_list = {
  "a"=>{"unit_id"=>"43", "dep_id"=>"153", "_destroy"=>"false"},
  "b"=>{"unit_id"=>"43", "dep_id"=>"153", "_destroy"=>"false"},
  "c"=>{"unit_id"=>"43", "dep_id"=>"154", "_destroy"=>"false"},
  "d"=>{"unit_id"=>"42", "dep_id"=>"154", "_destroy"=>"false"}
}
hash_list.to_a
         .uniq { |_, hash| hash.values_at('unit_id', 'dep_id', '_destroy') }
         .to_h
# => {"a"=>{"unit_id"=>"43", "dep_id"=>"153", "_destroy"=>"false"}, "c"=>{"unit_id"=>"43", "dep_id"=>"154", "_destroy"=>"false"}, "d"=>{"unit_id"=>"42", "dep_id"=>"154", "_destroy"=>"false"}}
注意:如果内部散列只有post中显示的键,那么
hash#values
就足够了。

您可以这样做

hash_list.invert.invert
创建一个新哈希,其中旧哈希的值是新哈希的键,这将删除旧哈希的任何重复值。对
invert
的第二次调用将交换回原值


但是,这并不能让您控制删除重复值的哪些键。

也可以编写以下内容,但Frederick的解决方案显然是要使用的:

Hash[hash_list.group_by { |_,v| v }.map { |_,v| v.first }]
  #=> {"a"=>{"unit_id"=>"43", "dep_id"=>"153", "_destroy"=>"false"},
  #    "c"=>{"unit_id"=>"43", "dep_id"=>"154", "_destroy"=>"false"},
  #    "d"=>{"unit_id"=>"42", "dep_id"=>"154", "_destroy"=>"false"}}

对于Ruby 1.9+来说,这将保留所有具有value
v
的键值对中的第一个键值对
k=>v
,删除哪个键?为什么删除了“b”而不是“a”?但是如果钥匙不同呢?@JikkuJose不这么认为。我根据OP提供的数据回答。这是OP的责任。。反正我已经修好了。但是可能有很多事情,这是不可能假设的。我们根据在帖子中看到的内容来回答。好的,是的!不应该假设并且应该解决最低要求。@JikkuJose请参阅另一个答案。。。你如何控制那里?这里的人就是这么想的。:)