假设我们有
b = {"b"=>"c"}
通过b.invert
,我们可以轻松获得
{"c"=>"b"}
那是我想要尝试一些非常酷的东西的时候。假设我们有
a = {"a"=>{"b"=>"c"}}
这是一个相当有效的方法来实现这个{{"c"=>"b"}=>"a"}
(这里我们扭转最内在的hash
并努力解决问题)
当然最好将其扩展到彼此之间的n
个哈希值。我一直在寻找其他类似的问题,但没有找到任何问题。
感谢。
答案 0 :(得分:5)
这可以通过用于反转散列的键的递归方法(以及值,如果需要)来实现。例如:
hsh = {{"c"=>"b"}=>"a"}
def recursive_invert(hsh)
hsh.each_with_object({}) do |(k, v), inverted_hsh|
if k.is_a? Hash
k = recursive_invert(k)
end
inverted_hsh[v] = k
end
end
recursive_invert(hsh) # {"a"=>{"b"=>"c"}}
答案 1 :(得分:4)
这是一个双向工作的递归解决方案。
def deep_invert(h)
h.each_with_object({}) do |(k,v),obj|
k = deep_invert(k) if k.is_a?(Hash)
v = deep_invert(v) if v.is_a?(Hash)
obj[v] = k
end
end
示例:
a = {"a"=>{"b"=>"c"}}
deep_invert(a)
#=> {{"c"=>"b"}=>"a"}
deep_invert(deep_invert(a)) == a
#=> true