【问题标题】:Merging hashes with values having the same key getting appended将哈希与具有相同键的值合并
【发布时间】:2020-11-16 22:46:55
【问题描述】:

我想知道实现这一目标的最佳方法是什么:

my_hash_1 = { fruits: { red: 'apple' }, vegetables: { green: 'spinach' } }

my_hash_2 = { fruits: { green: 'grapes' } }

expected_output = { fruits: { red: 'apple', green: 'grapes' }, vegetables: { green: 'spinach' } }

我已经研究过使用合并!但这给了我输出:

{:fruits=>{:green=>"grapes"}, :vegetables=>{:green=>"spinach"}}

【问题讨论】:

    标签: ruby hash merge hash-of-hashes


    【解决方案1】:

    merge 不是递归的,因此它只会将两个哈希中的 fruitsvegetables 项与其默认行为合并。您需要向merge! 提供一个块以进入下一级哈希并将它们也与默认的merge 合并。

    my_hash_1 = { fruits: { red: 'apple' }, vegetables: { green: 'spinach' } }
    my_hash_2 = { fruits: { green: 'grapes' } }
    
    expected_output = my_hash_1.merge(my_hash_2) { |_, h1, h2| h1.merge(h2) }
    
    p expected_output
    

    结果

    {:fruits=>{:red=>"apple", :green=>"grapes"}, :vegetables=>{:green=>"spinach"}}
    

    【讨论】:

      【解决方案2】:
      my_hash_1 = { fruits: { red: 'apple' }, vegetables: { green: 'spinach' } }
      my_hash_2 = { fruits: { green: 'grapes' } }
      my_hash_3 = { fruits: { yellow: 'mango' },spice: { red: 'chilli' }}
      
      # extended method (multiple hash)
      def merge_hash(arr_of_hash)
          result = {}
          arr_of_hash.each do |_hash|
              _hash.each{ |k,v| result[k].nil? ? result[k] = v : result[k].merge!(v) }
          end
          result
      end
      puts merge_hash([my_hash_1,my_hash_2,my_hash_3])
      # {:fruits=>{:red=>"apple", :green=>"grapes", :yellow=>"mango"}, :vegetables=>{:green=>"spinach"}, :spice=>{:red=>"chilli"}}
      

      【讨论】:

      • 谢谢!这看起来是一种在哈希哈希之间进行这种合并的好方法
      【解决方案3】:

      这两个答案确实解决了我试图做的事情,但由于我只使用两个哈希并且知道要合并哪些键,所以我最终做了这样的事情,我发现这是一种更简单的方法。

      my_hash_1 = { fruits: { red: 'apple' }, vegetables: { green: 'spinach' } }
      
      my_hash_2 = { fruits: { green: 'grapes' } }
      
      my_hash_1[:fruits]&.merge!(my_hash_2[:fruits]) unless my_hash_2[:fruits].nil?
      

      这实际上会将两者合并到my_hash_1 中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-05-03
        • 2018-02-12
        • 1970-01-01
        • 2014-09-14
        • 2013-02-24
        • 2018-06-10
        • 2013-05-04
        • 2021-05-14
        相关资源
        最近更新 更多