2015-07-21 315 views
0

我想平坦的嵌套哈希。我的散列具有這種結構:在哈希數組中轉換紅寶石嵌套哈希

   { 
        "asNew":"N", 
        "categoryId":40000007, 
        "categoryName":"CATALOGO", 
        "categoryType":"TYPE_NODE", 
        "contentId":40000007, 
        "contentTitle":"CATALOGO", 
        "contentType":"CATEGORY_NODE", 
        "orderId":0, 
        "urlPictures":"" 
       } 

基本上每個鍵「所屬分類」具有陣列值和:

{ 
    "errorDescription":"", 
    "message":"", 
    "resultCode":"OK", 
    "resultObj":{ 
     "categoryList":[ 
     { 
      "asNew":"N", 
      "categoryId":40000000, 
      "categoryList":[ 
       { 
        "asNew":"N", 
        "categoryId":40000007, 
        "categoryList":[ 
        ], 
        "categoryName":"CATALOGO", 
        "categoryType":"TYPE_NODE", 
        "contentId":40000007, 
        "contentTitle":"CATALOGO", 
        "contentType":"CATEGORY_NODE", 
        "orderId":0, 
        "urlPictures":"" 
       }, 
       { 
        "asNew":"N", 
        "categoryId":40000018, 
        "categoryList":[ 
        { 
         "asNew":"N", 
         "categoryId":40000019, 
         "categoryList":[ 

         ], 
         "categoryName":"CANALI CALCIO", 
         "categoryType":"TYPE_VOD", 
         "contentId":40000019, 
         "contentTitle":"CALCIO & SPORT", 
         "contentType":"CATEGORY_LEAF", 
         "orderId":0, 
         "urlPictures":"" 
        }, 
        { 
         "asNew":"N", 
         "categoryId":40000020, 
         "categoryList":[ 

         ], 
         "categoryName":"CANALI CINEMA", 
         "categoryType":"TYPE_VOD", 
         "contentId":40000020, 
         "contentTitle":"CINEMA & SERIE", 
         "contentType":"CATEGORY_LEAF", 
         "orderId":1, 
         "urlPictures":"" 
        } 
        ], 
        "categoryName":"CANALI TV", 
        "categoryType":"TYPE_NODE", 
        "contentId":40000018, 
        "contentTitle":"CANALI TV", 
        "contentType":"CATEGORY_NODE", 
        "orderId":1, 
        "urlPictures":"" 
       } 
      ], 
      "categoryName":"ROOT", 
      "categoryType":"TYPE_NODE", 
      "contentId":40000000, 
      "contentTitle":"ROOT", 
      "contentType":"", 
      "orderId":0, 
      "urlPictures":"" 
     } 
     ] 
    } 
} 

我必須在對象的數組,其中每個對象具有這種結構該散列變換這個數組有一個或多個散列與另一個鍵「categoryList」。我必須將每個categoryList數組中的所有對象移動到另一個沒有categoryList'鍵'的數組中。

編輯

我加入這個方法湊類

class Hash 
    def find_all_values_for(key) 
    result = [] 
    result << self[key] 
    unless self.values.nil? 
     self.values.each do |values| 
     values = [values] unless values.is_a? Array 
     values.each do |value| 
      result += value.find_all_values_for(key) if value.is_a? Hash 
     end 
     end 
    end 
    result.flatten.compact 
    end 
end 

而我得到的陣列刪除所屬分類鍵

h.map { |c| c.except!('categoryList') } 

它的工作原理,但meybe還有一個更地圖高效的方式。

+3

我建議你拿一把砍刀作爲例子,以減少它到最基本的要領。例如,可以在你的對象數組中的哈希值只是:'{ 「asNew」: 「N」, 「的categoryId」:40000007, 「類別名稱」: 「CATALOGO」, 「categoryType」: 「TYPE_NODE」 }'?另外,如果'h'是你的哈希,是不是希望平坦化?h [「categoryList」]? –

回答

0

此代碼將返回請求的對象數組。

def flatten_categoryList(categoryList) 
    categoryList.inject([]) do |result, item| 
    result + flatten_categoryList(item.delete("categoryList")) << item 
    end 
end 

flatten_categoryList(h["resultObj"]["categoryList"]) 

我無法運行你的基準測試,因此判斷解決方案目前是主觀的。