簡體   English   中英

在哈希數組中轉換紅寶石嵌套哈希

[英]Convert a ruby nested hash in array of hashes

我正在嘗試整理嵌套的哈希。 我的哈希具有以下結構:

    {
   "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":""
         }
      ]
   }
}

我必須將此哈希轉換為對象數組,其中每個對象都具有以下結構:

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

基本上,每個鍵“ categoryList”都有一個數組作為值,並且此數組具有一個或多個散列,以及另一個鍵“ categoryList”。 我必須將每個categoryList數組中的所有對象移動到沒有categoryList'key'的另一個數組中。

編輯

我將此方法添加到哈希類

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

我映射刪除了CategoryList鍵的結果數組

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

它可以工作,但是有一種更有效的方法。

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

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

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

我無法運行您的軟件來獲得基准,因此判斷解決方案目前是主觀的。

暫無
暫無

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

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