我決定寫我自己的車輪(感謝Patru,投了)。
而且我有這樣的功能:
def flat_hash_of_arrays(hash,string = "",delimiter="/",result = [])
# choose delimiter
hash.each do |key,value|
# string dup for avoid string-reference (oh, Ruby)
newString = string + delimiter + key
# if value is array
if value.is_a?(Array)
# if array not empty
value.each do |elementOfArray|
# if a string, I dont need recursion, hah
if elementOfArray.is_a?(String)
resultString = newString + delimiter + elementOfArray
# add new object
result << resultString
end
# if a hash, I need recursion
if elementOfArray.is_a?(Hash)
flat_hash_of_arrays(elementOfArray,newString,delimiter,result)
end
end
end
end
end
並對其進行測試:
flatten_hash = {
"key1" => [
"value1",
{"key2" => ["value2"]},
{"key3" => [
"value3",
{
"key4" => "value4"
}
]
},
"value4",
{
"key4" => ["value5"],
}
]
}
result = []
flat_hash_of_arrays(flatten_hash,"","/",result)
puts result
輸出爲:
/key1/value1
/key1/key2/value2
/key1/key3/value3
/key1/value4
/key1/key4/value5
罰款!
查看答案[這裏](http://stackoverflow.com/questions/9647997/converting-a-nested-hash-into-a-flat-hash)扁化散列。然後將每個扁平元素與目錄分隔符連接起來。 – sawa
你的結構不一致。在葉子上,你有一個像'{「key2」=>「value2」}'的嵌入式哈希,但是在分支處,你有一個類似'[「value1」,...]'的數組。這是不好的。你應該一直使用哈希。 – sawa
@sawa是的,謝謝,我編輯了我的問題 – gaussblurinc