我想以编程方式将此转换的数组:如何深哈希转换键
{
"a"=>
{"1"=>
{"A"=>
{"Standard"=>"true"}
}
},
"b"=>
{"1"=>
{"A"=>
{"Standard"=>"true"}
}
}
}
像这样的数组:
['a/1/A/Standard', 'b/1/A/Standard']
我想以编程方式将此转换的数组:如何深哈希转换键
{
"a"=>
{"1"=>
{"A"=>
{"Standard"=>"true"}
}
},
"b"=>
{"1"=>
{"A"=>
{"Standard"=>"true"}
}
}
}
像这样的数组:
['a/1/A/Standard', 'b/1/A/Standard']
从我的其他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"]
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"]
发现这个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"]
从地图该块可以被简化为 '[键,extract_keys(值)]加入('/ ')' – megas
尼斯!我没想过连接遍历数组中的数组。 – Winfield