繁体   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