[英]Merge array of hashes and re-sort it
我有很多哈希看起來像
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},
# ...
],
}
像這樣嗎
arr.group_by { |item| item["partner_name"] }.
map do |partner_name, data|
publishers = data.map { |h| Hash[:name, h["publisher_name"]] }
modules = data.map { |h| Hash[:mn, h["mn"], :mid, h["mid"]] }
Hash[:partner, partner_name, :publishers, publishers, :modules, modules]
end
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
由於數組中的哈希值似乎已經成為合作伙伴的范圍,因此一個簡單的實現可能類似於:
new_h = {partner: arr.first["partner_name"],publishers: [],modules: []}
arr.each_with_object(new_h) do |h, result|
result[:publishers] << {name: h["publisher_name"]}
result[:modules] << h.slice("mn","mid")
end
如果它們的作用域沒有如圖所示,則只需對其進行分組和映射:
arr.group_by {|h| h["partner_name"]}.map do |name,values|
new_h = {partner: name,publishers: [],modules: []}
values.each_with_object(new_h) do |h, result|
result[:publishers] << {name: h["publisher_name"]}
result[:modules] << h.slice("mn","mid")
end
end
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.