카테고리 없음

[루비] 파일 경로와 유사한 배열에 대한 배열의 해시 [중복]

행복을전해요 2021. 3. 1. 18:06

나는 당신이 이것을하기 위해 어떤 바퀴도 재발 명하지 않을 것이라고 생각합니다. 배열과 해시의 중첩 구조를 탐색하고 무언가가 배열인지 해시인지에 따라 요소에 완전히 다르게 반응하고 싶습니다. 원하는만큼 유연 해지려면 블록을 사용하여 여러 가지를 변경해야하므로 라이브러리 함수가 정확히 그렇게 할 수는 없습니다.

요컨대 재귀 함수를 작성하여이를 수행하십시오.

(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