2016-08-15 43 views
0

我得到了兩個看起來相似的數組,其中一部分是重複的,我需要將它們合併。這是第一個數組。Rails結合兩個陣列與散列結構

第一

[ 
     { 
      :group_id => "12873", 
     :question_sets => [ 
      { 
        :id => 29435, 
       :name => "Question1" 
      }, 
      { 
        :id => 29349, 
       :name => "Question2" 
      }, 
      ] 
     }, 
     { 
      :group_id => "12876", 
     :question_sets => [ 
      { 
        :id => 29443, 
       :name => "Question3" 
      } 
      ] 
     } 
] 

這裏是第二個數組

[ 
     { 
      :group_id => "12873", 
     :question_sets => [ 
      { 
        :id => 29435, 
       :name => "Question1" 
      }, 
      { 
        :id => 29338, 
       :name => "Question4" 
      }, 
      ] 
     }, 
     { 
      :group_id => "12888", #(not in first array) 
     :question_sets => [ 
      { 
        :id => 29443, 
       :name => "Question3" 
      } 
      ] 
     } 
] 

的想法是對question_sets的idname由同一group_id相結合,在第二陣列中的每個記錄需要進行組合。如果沒有相同的group_id,請創建group_id

,結果會是怎樣

[ 
     { 
      :group_id => "12873", 
     :question_sets => [ 
      { 
        :id => 29435, 
       :name => "Question1" 
      }, 
      { 
        :id => 29349, 
       :name => "Question2" 
      }, 
      { 
        :id => 29338, 
       :name => "Question4" 
      } 
      ] 
     }, 
     { 
      :group_id => "12876", 
     :question_sets => [ 
      { 
        :id => 29443, 
       :name => "Question3" 
      } 
      ] 
     }, 
     { 
      :group_id => "12888", 
     :question_sets => [ 
      { 
        :id => 29443, 
       :name => "Question3" 
      } 
      ] 
     } 
] 
+1

您已經設置了您的要求,但是您是如何實施它們的? – MarsAtomic

+0

原因我有兩個API,但它像他們一樣返回,我需要將它們修改爲新的API。 –

+0

嗨,歡迎來到Stack Overflow。在這裏,我們希望你先做好自己的工作,然後如果遇到問題,向我們展示你的嘗試(即使它不工作)以及收到的任何錯誤消息,我們將幫助你調試發生的事情。我們不會爲你編寫或設計你的代碼 - 你必須自己給它一個bash。你可能會驚訝自己一旦你給它一個鏡頭,你可以做多少:) –

回答

1

如果h1h2與鍵:id:name哈希,我認爲h1[:name] == h2[:name]當且僅當h1[:id] == h2[:id]

如果a1a2等於你的兩個數組,您可以執行以下操作。

(a1+a2).group_by { |h| h[:group_id] }. 
     map { |k,v| { group_id: k, 
         question_sets: v.flat_map { |g| g[:question_sets] }.uniq } } 
    #=> [{:group_id=>"12873", 
    #  :question_sets=>[ 
    #  {:id=>29435, :name=>"Question1"}, 
    #  {:id=>29349, :name=>"Question2"}, 
    #  {:id=>29338, :name=>"Question4"} 
    #  ] 
    # }, 
    # {:group_id=>"12876", 
    #  :question_sets=>[{:id=>29443, :name=>"Question3"}] 
    # }, 
    # {:group_id=>"12888", 
    #  :question_sets=>[{:id=>29443, :name=>"Question3"}] 
    # } 
    # ] 

步驟如下。

a = a1+a2 
    #=> [{:group_id=>"12873", 
    #  :question_sets=>[ 
    #  {:id=>29435, :name=>"Question1"}, 
    #  {:id=>29349, :name=>"Question2"} 
    #  ] 
    # }, 
    # {:group_id=>"12876", 
    #  :question_sets=>[{:id=>29443, :name=>"Question3"}] 
    # }, 
    # {:group_id=>"12873", 
    #  :question_sets=>[ 
    #  {:id=>29435, :name=>"Question1"}, 
    #  {:id=>29338, :name=>"Question4"} 
    #  ] 
    # }, 
    # {:group_id=>"12888", 
    #  :question_sets=>[{:id=>29443, :name=>"Question3"}] 
    # } 
    # ] 

b = a.group_by { |h| h[:group_id] } 
    #=> {"12873"=>[ 
    #  {:group_id=>"12873", 
    #  :question_sets=>[ 
    #  {:id=>29435, :name=>"Question1"}, 
    #  {:id=>29349, :name=>"Question2"} 
    #  ] 
    #  }, 
    #  {:group_id=>"12873", 
    #  :question_sets=>[ 
    #  {:id=>29435, :name=>"Question1"}, 
    #  {:id=>29338, :name=>"Question4"} 
    #  ] 
    #  } 
    # ], 
    # "12876"=>[ 
    #  {:group_id=>"12876", 
    #  :question_sets=>[{:id=>29443, :name=>"Question3"}] 
    #  } 
    # ], 
    # "12888"=>[ 
    #  {:group_id=>"12888", 
    #  :question_sets=>[{:id=>29443, :name=>"Question3"}] 
    #  } 
    # ] 
    # } 

b.map { |k,v| { group_id: k, 
       question_sets: v.flat_map { |g| g[:question_sets] }.uniq } } 
    #=> array of hashes shown above. 

考慮的b傳遞給map的塊中的第一個元素,以該塊變量被分配:

k,v = b.first 
k #=> "12873", 
v #=> [{:group_id=>"12873", 
    #  :question_sets=>[ 
    #  {:id=>29435, :name=>"Question1"}, 
    #  {:id=>29349, :name=>"Question2"} 
    #  ] 
    # }, 
    # {:group_id=>"12873", 
    #  :question_sets=>[ 
    #  {:id=>29435, :name=>"Question1"}, 
    #  {:id=>29338, :name=>"Question4"} 
    #  ] 
    # } 
    # ] 

所以構成散列的塊計算如下。

c = v.flat_map { |g| g[:question_sets] } 
    #=> [{:id=>29435, :name=>"Question1"}, 
    # {:id=>29349, :name=>"Question2"}, 
    # {:id=>29435, :name=>"Question1"}, 
    # {:id=>29338, :name=>"Question4"}] 
d = c.uniq 
    #=> [{:id=>29435, :name=>"Question1"}, 
    # {:id=>29349, :name=>"Question2"}, 
    # {:id=>29338, :name=>"Question4"}] 

所以塊返回哈希

{ group_id: k, question_sets: d } 
    #=> { group_id: "12873", 
    #  question_sets: [ 
    #  {:id=>29435, :name=>"Question1"}, 
    #  {:id=>29349, :name=>"Question2"}, 
    #  {:id=>29338, :name=>"Question4"} 
    #  ] 
    # } 

剩餘計算是相似的。

+0

你是這樣一個天才,我應該把許多'每個'來檢查每個關鍵值是否存在。 Ruby是一門令人驚歎的語言! –

+0

我很高興我的幫助。是的,Ruby非常酷。 –