2017-04-07 122 views
-1

給定一個嵌套散列(見下面)我想排序具有':position'屬性的兄弟。排序嵌套數據結構

在下面的散列中,您可以看到child和child_child屬性是一個數組,但是該位置沒有排序。

{:parent=> 
     [{:id=>"29637484-4d39-4828-bebc-52e4ecb12250", 
     :extra_data=>"parent_extra_data_1two", 
     :position=>2, 
     :resource_id=>"parent_resource_id_1two", 
     :child=> 
     [{:id=>"57c9dab3-f091-48e7-85a7-4a8a3c4782a6", :extra_data=>"child_extra_data_1two", :position=>2, :resource_id=>"child_resource_id_2two"}, 
      {:id=>"86b60506-f431-41f4-8555-30a83e9296f9", 
      :extra_data=>"child_extra_data_1", 
      :position=>1, 
      :resource_id=>"child_resource_id_1", 
      :child_child=> 
      [{:id=>"04bb9af2-eac8-4fcf-8253-38b0ccb538c2", :extra_data=>"child_child_extra_data_one", :position=>1, :resource_id=>"child_child_one"}, 
      {:id=>"94947cc4-e27a-4f79-b585-f26db7ce4e66", :extra_data=>"child_child_extra_data_three", :position=>3, :resource_id=>"child_child_three"}, 
      {:id=>"98fe0b96-a8cd-488b-bf00-9d48633355d3", :extra_data=>"child_child_extra_data_two", :position=>2, :resource_id=>"child_child_two"}]}]}]} 

將成爲

{:parent=> 
     [{:id=>"29637484-4d39-4828-bebc-52e4ecb12250", 
     :extra_data=>"parent_extra_data_1two", 
     :position=>2, 
     :resource_id=>"parent_resource_id_1two", 
     :child=> 
     [{:id=>"86b60506-f431-41f4-8555-30a83e9296f9", 
      :extra_data=>"child_extra_data_1", 
      :position=>1, 
      :resource_id=>"child_resource_id_1", 
      :child_child=> 
       [{:id=>"04bb9af2-eac8-4fcf-8253-38b0ccb538c2", :extra_data=>"child_child_extra_data_one", :position=>1, :resource_id=>"child_child_one"}, 
       {:id=>"98fe0b96-a8cd-488b-bf00-9d48633355d3", :extra_data=>"child_child_extra_data_two", :position=>2, :resource_id=>"child_child_two"}, 
       {:id=>"94947cc4-e27a-4f79-b585-f26db7ce4e66", :extra_data=>"child_child_extra_data_three", :position=>3, :resource_id=>"child_child_three"}]}, 
      {:id=>"57c9dab3-f091-48e7-85a7-4a8a3c4782a6", 
      :extra_data=>"child_extra_data_1two", 
      :position=>2, 
      :resource_id=>"child_resource_id_2two" 
      }]}]} 
+0

請閱讀「[問]」包括鏈接頁面,「[mcve]」和「[Stack Overflow用戶需要多少研究工作?](http://meta.stackoverflow.com/questions/261592)」。我們希望看到你的努力的證據。你嘗試了什麼?你搜索並沒有找到任何東西?你有沒有找到東西,但它沒有幫助?你有沒有嘗試寫代碼?如果不是,爲什麼?如果是這樣,那麼最小的代碼示例顯示了您嘗試的內容以及它爲什麼不起作用?沒有它,看起來你沒有嘗試並希望我們爲你寫信。 –

回答

0

@ddubs感謝遞歸想法。非常具有挑戰性,因爲我從來沒有必須使用遞歸之前。

def sort_tree(tree) 
    tree.each_key.map { |atr| 
     if obj_keys.include? atr #obj_keys is an array of symbols [:parent, child, child_child] 
      tree[atr].sort_by!{|q| q[:position]} 
      tree[atr].map! {|q| sort_tree(q)} 
     end 
     {atr => tree[atr]} 
    }.reduce(:merge) 
end 
0

這是一個有趣的練習遞歸函數,你真的應該嘗試的工作,雖然這些東西,因爲他們肯定會提高自己的技能。

def sort_me(data) 
    if data.is_a? Array 
    data.sort_by! { |h| h[:position] } 
    data.map { |i| sort_me(i) } 
    elsif data.has_key? :child 
    if data[:child].is_a? Array 
     data[:child].map { |i| sort_me(i) } 
    end 
    return data[:child].sort_by! { |h| h[:position] } 
    elsif data.has_key? :child_child 
    return data[:child_child].sort_by! { |h| h[:position] } 
    end 
    return data 
end 

puts sort_me(data[:parent]).to_yaml 

YAML結果(容易對眼睛)再次

--- 
- :id: 29637484-4d39-4828-bebc-52e4ecb12250 
    :extra_data: parent_extra_data_1two 
    :position: 2 
    :resource_id: parent_resource_id_1two 
    :child: 
    - :id: 86b60506-f431-41f4-8555-30a83e9296f9 
    :extra_data: child_extra_data_1 
    :position: 1 
    :resource_id: child_resource_id_1 
    :child_child: 
    - :id: 04bb9af2-eac8-4fcf-8253-38b0ccb538c2 
     :extra_data: child_child_extra_data_one 
     :position: 1 
     :resource_id: child_child_one 
    - :id: 98fe0b96-a8cd-488b-bf00-9d48633355d3 
     :extra_data: child_child_extra_data_two 
     :position: 2 
     :resource_id: child_child_two 
    - :id: 94947cc4-e27a-4f79-b585-f26db7ce4e66 
     :extra_data: child_child_extra_data_three 
     :position: 3 
     :resource_id: child_child_three 
    - :id: 57c9dab3-f091-48e7-85a7-4a8a3c4782a6 
    :extra_data: child_extra_data_1two 
    :position: 2 
    :resource_id: child_resource_id_2two 
+0

感謝遞歸函數提示。我會聽取您的建議,並在閱讀完整答案之前親自嘗試。 –