【问题标题】:Merge two arrays of hashes whilst keeping all distinct values合并两个哈希数组,同时保留所有不同的值
【发布时间】:2014-04-30 04:57:02
【问题描述】:

我想将两个哈希数组合并成一个新数组:

array1 = [{"Name1" => {gender: 'female', nationality: ['german', 'danish']}}]
array2 = [{"Name1" => {gender: 'male', nationality: ['german', 'austrian']}}]

现在这是我正在寻找的结果:

new_array = [{"Name1" => {gender: ['female', 'male'], nationality: ['german', 'danish', 'austrian']}}]

我可以在 Ruby 文档中找到的唯一合并选项会用另一个哈希覆盖重复项。那么如何实现我需要的版本呢?

【问题讨论】:

    标签: ruby arrays hash merge


    【解决方案1】:

    您可以将可选的块参数传递给Hash#merge。为重复的键调用该块。在块的返回值被使用而不是被覆盖。

    array1 = [{"Name1" => {gender: 'female', nationality: ['german', 'danish']}}]
    array2 = [{"Name1" => {gender: 'male', nationality: ['german', 'austrian']}}]
    
    new_array = [{'Name1' => array1[0]['Name1'].merge(array2[0]['Name1']) { |k,o,n|
      Array(o) | Array(n)
    }}]
    # => [{"Name1"=>
    #       {:gender=>["female", "male"],
    #        :nationality=>["german", "danish", "austrian"]}}]
    

    【讨论】:

    • Array(o) 将 o 变成 [o] 并保持 [o] 只是 [o]
    • 感谢您的回答。如果您要获取 hash_key ('Name1') 而不是硬编码,您将如何组合该操作?我需要循环遍历它们,而不是手动放入其中的每一个。
    • @steenslag,感谢您的评论。我更新了使用Array函数的答案。
    • @Severin,使用另一个 merge 调用合并 array1[0]array2[0]new_array = [ array1[0].merge(array2[0]) { |k,o,n| o.merge(n) { |k,o,n| Array(o) | Array(n) } } ]
    【解决方案2】:

    递归方式:

    array1 = [{"Name1" => {gender: 'female', nationality: ['german', 'danish']}}]
    array2 = [{"Name1" => {gender: 'male', nationality: ['german', 'austrian']}}]
    
    def merge_recur(ar1,ar2)
      (ar1+ar2).inject do |h1,h2|
        h1.merge(h2) do |k,o,n|
          if o.is_a?(Hash) and n.is_a?(Hash)
            merge_recur([o],[n])
          elsif o.is_a?(Array) and n.is_a?(Array)
            o | n
          else
            [o,n]
          end
        end
      end
    end
    
    merge_recur(array1,array2)
    # => {"Name1"=>
    #      {:gender=>["female", "male"],
    #       :nationality=>["german", "danish", "austrian"]}}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-14
      • 2020-06-23
      • 2019-05-03
      • 1970-01-01
      • 2021-03-25
      • 1970-01-01
      • 2016-10-07
      相关资源
      最近更新 更多