2012-09-19 38 views
1

我想以编程方式将此转换的数组:如何深哈希转换键

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

像这样的数组:

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

回答

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 
=> ["https://stackoverflow.com/a/1/A/Standard", "/b/1/A/Standard"] 
4
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"] 
+1

从地图该块可以被简化为 '[键,extract_keys(值)]加入('/ ')' – megas

+0

尼斯!我没想过连接遍历数组中的数组。 – Winfield

1

发现这个flatten拉姆达的定义。

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"] 
相关问题