簡體   English   中英

通過相同的鍵將兩個哈希與數組合並

[英]Merge two hashes with arrays by the same key Ruby

我需要Ruby的幫助。 我有兩個從JSON解析出來的哈希值。 我使用以下代碼來解析文件:

document = JSON.load File.new("hosts.txt")
file = JSON.load File.new("admins.txt")

結果就是這樣的兩個大哈希值:

document={"total"=>13, "subtotal"=>13, "page"=>1, "per_page"=>20,
          "search"=>nil, "sort"=>{"by"=>nil, "order"=>nil},
          "results"=>[
             {"ip"=>"10", "environment_id"=>7, 
                 "medium_id"=>nil, "name"=>"one", "id"=>1},
             {"ip"=>"15", "environment_id"=>7, 
                 "medium_id"=>nil, "name"=>"two", "id"=>1},
             {"ip"=>"10.5", "environment_id"=>6, 
                 "medium_id"=>nil, "name"=>"four", "id"=>1}]}

file={"admins"=>[
           {"name"=>"one", "surname"=>"Mark", "email"=>"mark@o.com"},
           {"name"=>"two", "surname"=>"Adam", "email"=>"Adam@o.com"},
           {"name"=>"four", "surname"=>"Ami", "email"=>"Ami@o.com"}]}

從第一個哈希中,我只需要來自結果鍵的信息,因此我已經完成了

data = document["results"]

對於第二個哈希,我已經做了同樣的事情:

people = file["admins"]

現在,當“名稱”值相同時,我想將姓和電子郵件從人員數組移到數據數組,並使用另一個哈希,如下所示:

new = {"all_data"=>[
        {"ip"=>"10", "environment_id"=>7, "medium_id"=>nil,
           "name"=>"one", "id"=>1, "surname"=>"Mark", "email"=>"mark@o.com"},
        {"ip"=>"15", "environment_id"=>7, "medium_id"=>nil,
           "name"=>"two", "id"=>1, "surname"=>"Adam", "email"=>"Adam@o.com"},
        {"ip"=>"10.5", "environment_id"=>6, "medium_id"=>nil,
           "name"=>"four", "id"=>1, "surname"=>"Ami", "email"=>"Ami@o.com"}]}

您能幫我做到這一點並解釋它如何工作嗎?

personal_data = file['admins'].map(&:dup)
                              .group_by { |e| e.delete('name') }

上面的dup / delete技巧不是必需的,因為在任何情況下都可以正確處理下面的merge ,但這是出於語義清晰的目的。

document['results'].map do |h|
  h.merge(personal_data[h['name']].first) if personal_data[h['name']]
end

#⇒ [
#    {"ip"=>"10", "environment_id"=>7, "medium_id"=>nil, "name"=>"one",
#       "id"=>1, "surname"=>"Mark", "email"=>"mark@o.com"},
#    {"ip"=>"15", "environment_id"=>7, "medium_id"=>nil, "name"=>"two",
#       "id"=>1, "surname"=>"Adam", "email"=>"Adam@o.com"},
#    {"ip"=>"10.5", "environment_id"=>6, "medium_id"=>nil, "name"=>"four",
#       "id"=>1, "surname"=>"Ami", "email"=>"Ami@o.com"}]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM