首页 > 解决方案 > 合并哈希数组并重新排序

问题描述

我有一组哈希看起来像

arr = [
  {"partner_name"=>"Bell", "publisher_name"=>"News - Calgary", "mn"=>"", "mid"=>415},
  {"partner_name"=>"Bell", "publisher_name"=>"News - Vancouver Island", "mn"=>"Module 2.0 ", "mid"=>4528},
  {"partner_name"=>"Bell", "publisher_name"=>"News - Atlantic", "mn"=>"Module 2.0 ", "mid"=>4531},
  {"partner_name"=>"Bell", "publisher_name"=>"News - Kitchener", "mn"=>"Module 2.0 ", "mid"=>4535},
  {"partner_name"=>"Bell", "publisher_name"=>"News - London", "mn"=>"Module 2.0 ", "mid"=>4536},
  {"partner_name"=>"Bell", "publisher_name"=>"News - Ottawa", "mn"=>"Module 2.0 ", "mid"=>4539},
  {"partner_name"=>"Bell", "publisher_name"=>"News - Regina", "mn"=>"Module 2.0 ", "mid"=>4540},
  {"partner_name"=>"Bell", "publisher_name"=>"News - Saskatoon", "mn"=>"Module 2.0 ", "mid"=>4541},
  {"partner_name"=>"Bell", "publisher_name"=>"News - Toronto", "mn"=>"Module 2.0 ", "mid"=>4542},
  {"partner_name"=>"Bell", "publisher_name"=>"News - Windsor", "mn"=>"Module 2.0 ", "mid"=>4544},
  {"partner_name"=>"Bell", "publisher_name"=>"CP24", "mn"=>"Module 2.0 Platform", "mid"=>5413},
]

我试过做arr.group_by{|el|el['partner_name']}

我想达到这个结果

{
  partner:'Bell',
  publishers: [
    {name:'News - Vancouver Island'},
    {name:'News - Vancouver Island'},
    # ... and others
  ],
  modules:[
    {mn: val, mid: id_val},
    # ...
  ],
}

标签: ruby-on-railsrubyhash

解决方案


group_by 和地图

result = arr.
  group_by { |r| r["partner_name"] }.
  map do |(partner_name, records)|
    {
      name: partner_name,
      publishers: records.map do |r|
        { name: r["publisher_name"] }
      end,
      modules: records.map do |r|
        { mn: r["mn"], mid: r["mid"] }
      end,
    }
  end

推荐阅读