如何将红宝石中的两个哈希转置为单个哈希或数组?

时间:2019-03-24 19:59:06

标签: ruby hash enumerable

我想使用下面的两个哈希并将它们组合成新的哈希或数组:

hash1 = {1=>"]", 2=>"}", 3=>")", 4=>"(", 5=>"{", 6=>"["}
hash2 = {1=>"[", 2=>"{", 3=>"(", 4=>")", 5=>"}", 6=>"]"}

我希望结果看起来像这样:

result = {"["=>"]", "{"=>"}", "("=>")"}

result = [ ["[","]"], ["{","}"], ["(",")"] ]

有没有可以做到这一点的红宝石方法?

4 个答案:

答案 0 :(得分:4)

您可以使用Hash#transform_keys

res = hash1.transform_keys { |k| hash2[k] }

res #=> {"["=>"]", "{"=>"}", "("=>")", ")"=>"(", "}"=>"{", "]"=>"["}

res.first(3) #=> [["[", "]"], ["{", "}"], ["(", ")"]]

答案 1 :(得分:1)

好吧,另一种获取所需内容的方法是使用Hash#deep_merge 像这样:

res = hash1.deep_merge(hash2) { |key, this_val, other_val| [other_val , this_val] }.values
# =>  [["[", "]"], ["{", "}"], ["(", ")"], [")", "("], ["}", "{"], ["]", "["]
res.first(3) 
# => [["[", "]"], ["{", "}"], ["(", ")"]]

答案 2 :(得分:1)

hash1.each_with_object({}) { |(k, v), h| h[hash2[k]] = v }

#=> {"["=>"]", "{"=>"}", "("=>")", ")"=>"(", "}"=>"{", "]"=>"["}

或者:

hash2.each_with_object({}) { |(k, v), h| h[v] = hash1[k] }

#=> {"["=>"]", "{"=>"}", "("=>")", ")"=>"(", "}"=>"{", "]"=>"["}

答案 3 :(得分:0)

hash1.merge(hash2){|_, v1, v2| [v1, v2]}.values
# => [["]", "["], ["}", "{"], [")", "("], ["(", ")"], ["{", "}"], ["[", "]"]]