【问题标题】:How to convert a ruby hash with an 'array' key to a nested hash in Ruby?如何将带有“数组”键的 ruby​​ 哈希转换为 Ruby 中的嵌套哈希?
【发布时间】:2020-01-30 23:45:10
【问题描述】:

我正在尝试弄清楚如何转换这样的复杂哈希:

{
  ["A", "B"]=>{"id"=>123,"name"=>"test"},
  ["A", "F"]=>{"id"=>236,"name"=>"another test"},
  ["C", "F"]=>{"id"=>238,"name"=>"anoother test"}
}

变成一个更复杂的散列,比如

{
  "A"=>{
     "B"=>{"id"=>123,"name"=>"test"},
     "F"=>{"id"=>236,"name"=>"another test"}
  },
  "C"=>{
     "F"=>{"id"=>238,"name"=>"anoother test"}
  }
}

非常欢迎任何帮助!

【问题讨论】:

    标签: arrays ruby hash key


    【解决方案1】:

    each_with_object 可能是救援:

    hash.each_with_object(Hash.new {|h, k| h[k] = {}}) do |((first, last), v), memo|  
      memo[first].merge!(last => v)
    end
    #=> {"A"=>{"B"=>{"id"=>123, "name"=>"test"}, 
    #          "F"=>{"id"=>236, "name"=>"another test"}}, 
    #    "C"=>{"F"=>{"id"=>238, "name"=>"anoother test"}}}
    

    【讨论】:

    • 您可以告诉 Ruby 分解k|((k1, k2), v), memo|,而不是自己使用Array#{first/last}。根据实际数据,您甚至可以给它一个比k2(或k.last)更合适的名称。
    【解决方案2】:

    您也可以使用Enumerable#group_by 然后Hash#transform_values by Enumerable#map 使用Array#to_h 生成新哈希:

    h.group_by { |h,k| h.first }.transform_values { |v| v.map { |a, b| [a.last, b] }.to_h }
    

    【讨论】:

    • 真的很好!伟大的单线!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多