【问题标题】:How do I transpose two hashes in ruby to make a single hash or array?如何在 ruby​​ 中转置两个散列以生成单个散列或数组?
【发布时间】:2019-08-15 02:46:33
【问题描述】:

我想把下面的两个散列组合成一个新的散列或数组:

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

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

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

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

有没有 ruby​​ 方法可以做到这一点?

【问题讨论】:

    标签: ruby hash enumerable


    【解决方案1】:

    你可以使用Hash#transform_keys:

    res = hash1.transform_keys { |k| hash2[k] }
    
    res #=> {"["=>"]", "{"=>"}", "("=>")", ")"=>"(", "}"=>"{", "]"=>"["}
    
    res.first(3) #=> [["[", "]"], ["{", "}"], ["(", ")"]]
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:
        hash1.each_with_object({}) { |(k, v), h| h[hash2[k]] = v }
        
        #=> {"["=>"]", "{"=>"}", "("=>")", ")"=>"(", "}"=>"{", "]"=>"["}
        

        或者:

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

        【讨论】:

        • 这比@iGan 的出色答案的优势在于它可以与Hash#transform_keys 首次亮相时2.4 之前的Ruby 版本一起使用。
        【解决方案4】:
        hash1.merge(hash2){|_, v1, v2| [v1, v2]}.values
        # => [["]", "["], ["}", "{"], [")", "("], ["(", ")"], ["{", "}"], ["[", "]"]]
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2023-03-07
          • 2013-05-16
          • 1970-01-01
          • 1970-01-01
          • 2015-12-14
          • 1970-01-01
          • 2018-11-07
          相关资源
          最近更新 更多