【问题标题】:How to convert deep hash to array of keys如何将深度哈希转换为键数组
【发布时间】:2012-09-20 04:24:10
【问题描述】:

我想以编程方式转换它:

{
"a"=>
  {"1"=>
    {"A"=>
      {"Standard"=>"true"}
    }
  },
"b"=>
  {"1"=>
    {"A"=>
      {"Standard"=>"true"}
    }
  }
}

到这样的数组:

['a/1/A/Standard', 'b/1/A/Standard']

【问题讨论】:

    标签: ruby


    【解决方案1】:
    def extract_keys(hash)
      return [] unless hash.is_a?(Hash)
      hash.each_pair.map {|key, value| [key, extract_keys(value)].join('/') }
    end
    extract_keys(hash)
    => ["a/1/A/Standard", "b/1/A/Standard"]
    

    【讨论】:

    • map中的block可以简化为'[key, extract_keys(value)].join('/')'
    • 不错!没想到join遍历数组内的数组。
    【解决方案2】:

    来自我的另一个answers - 适合您的情况。查看flat_hash的更详细解决方案的链接

    def flat_hash(hash, k = "")
      return {k => hash} unless hash.is_a?(Hash)
      hash.inject({}){ |h, v| h.merge! flat_hash(v[-1], k + '/' + v[0]) }
    end
    
    example = {...} # your example hash
    foo = flat_hash(example).keys
    => ["/a/1/A/Standard", "/b/1/A/Standard"] 
    

    【讨论】:

      【解决方案3】:

      找到这个flatten lambda 定义。

      h = {
      "a"=>
        {"1"=>
          {"A"=>
            {"Standard"=>"true"}
           }
        },
      "b"=>
        {"1"=>
           {"A"=>
             {"Standard"=>"true"}
           }
        }
      }
      
      a = []
      
      flatten =
        lambda {|r|
          (recurse = lambda {|v|
            if v.is_a?(Hash)
              v.to_a.map{|v| recurse.call(v)}.flatten
            elsif v.is_a?(Array)
              v.flatten.map{|v| recurse.call(v)}
            else
              v.to_s
            end
          }).call(r)
        }
      
      h.each do |k,v|
        a << k + "/" + flatten.call(v).join("/")
      end
      

      输出:

       ["a/1/A/Standard/true", "b/1/A/Standard/true"]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-11-26
        • 2019-10-27
        • 2019-05-23
        • 2012-10-29
        • 1970-01-01
        • 2011-02-23
        • 1970-01-01
        • 2012-07-15
        相关资源
        最近更新 更多