删除具有不同哈希值的哈希哈希中的重复条目

Removing duplicate entries in a hash of hash with different hash values

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"=>"43", "dep_id"=>"153", "_destroy"=>"false", "id"=>"5"}
}

我期待如下结果,

{
 "c"=>{"unit_id"=>"43", "dep_id"=>"154", "_destroy"=>"false"},
 "d"=>{"unit_id"=>"43", "dep_id"=>"153", "_destroy"=>"false", "id"=>"5"}
}

我怎样才能得到上面的结果?如果我这样做

hash_list.invert.invert

然后,我得到

{
  "b"=>{"unit_id"=>"43", "dep_id"=>"153", "_destroy"=>"false"},
  "c"=>{"unit_id"=>"43", "dep_id"=>"154", "_destroy"=>"false"},
  "d"=>{"unit_id"=>"43", "dep_id"=>"153", "_destroy"=>"false", "id"=>"5"}
} 

在上面的结果中,其实不需要"b"。我需要用 id 维护值。

我定义哈希 g 被哈希 h 支配 当且仅当 g[k] == h[k] 对于 [=12= 中的所有键](即,对于 g.keys 中的所有 k)。此外,如果存在另一个键值对 kk=>hh,则我将 hash_list 中的键值对 k=>h 定义为 dominated h 由散列 hh.

支配

我假设要返回的散列仅包含来自 hash_list 的非支配键值对。使用此定义:

  • a 被删除,因为它由 b(和 d)和
  • 支配
  • b被移除,因为它被d支配。

代码

def remove_dominated_values(hash)
  hl = hash.dup
  keys = hl.keys
  key = keys.shift
  while keys.any?
    h = hl[key]
    hkeys, hvalues = hl[key].keys, hl[key].values
    hl.delete(key) if keys.any? { |k| hvalues == hl[k].values_at(*hkeys) }
    key = keys.shift
  end
  hl
end

例子

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"=>"43", "dep_id"=>"153", "_destroy"=>"false", "id"=>"5"}
}

remove_dominated_values(hash_list)
  #=> {"c"=>{"unit_id"=>"43", "dep_id"=>"154", "_destroy"=>"false"},
  #    "d"=>{"unit_id"=>"43", "dep_id"=>"153", "_destroy"=>"false", "id"=>"5"}}