有什么方法可以反转嵌套哈希?

时间:2016-08-24 15:14:26

标签: ruby hash

假设我们有

b = {"b"=>"c"}

通过b.invert,我们可以轻松获得

的结果
{"c"=>"b"}

那是我想要尝试一些非常酷的东西的时候。假设我们有

a = {"a"=>{"b"=>"c"}}

这是一个相当有效的方法来实现这个{{"c"=>"b"}=>"a"}(这里我们扭转最内在的hash并努力解决问题)

当然最好将其扩展到彼此之间的n个哈希值。我一直在寻找其他类似的问题,但没有找到任何问题。

感谢。

2 个答案:

答案 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