나는 당신이 이것을하기 위해 어떤 바퀴도 재발 명하지 않을 것이라고 생각합니다. 배열과 해시의 중첩 구조를 탐색하고 무언가가 배열인지 해시인지에 따라 요소에 완전히 다르게 반응하고 싶습니다. 원하는만큼 유연 해지려면 블록을 사용하여 여러 가지를 변경해야하므로 라이브러리 함수가 정확히 그렇게 할 수는 없습니다.
요컨대 재귀 함수를 작성하여이를 수행하십시오.
(Btw : 데이터 구조의 최상위 레벨은 배열의 해시가 아니라 해시의 배열입니다…)
-------------------나는 내 자신의 바퀴를 쓰기로 결정했습니다 (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
좋아!
출처
https://stackoverflow.com/questions/22089822