2014-02-28 52 views
0

這裏是陣列的散列的一個結構:散列陣列到文件路徑狀陣列

[ 
    { 
     "key1" => [ 
      "value1", 
      {"key2" => ["value2"]}, 
      {"key3" => [ 
           "value3", 
           { 
           "key4" => "value4" 
           } 
         ] 
      }     
     ] 
    }, 
    { 
     "anotherKey1" => [], 
    } 
] 

我要用於該結構像文件路徑所需的輸出:

/key1/value1 
/key1/key2/value2 
/key3/value3 
/key3/key4/value4 

我怎樣才能做到,如果沒有發明一個輪子?簡單的遞歸可能會有所幫助,但是有沒有現成的模塊?

+3

查看答案[這裏](http://stackoverflow.com/questions/9647997/converting-a-nested-hash-into-a-flat-hash)扁化散列。然後將每個扁平元素與目錄分隔符連接起來。 – sawa

+0

你的結構不一致。在葉子上,你有一個像'{「key2」=>「value2」}'的嵌入式哈希,但是在分支處,你有一個類似'[「value1」,...]'的數組。這是不好的。你應該一直使用哈希。 – sawa

+1

@sawa是的,謝謝,我編輯了我的問題 – gaussblurinc

回答

1

我不認爲你會重新發明任何車輪來做到這一點。你想遍歷一個數組和散列的嵌套結構,並根據某個數組是否是一個數組或哈希來對這些元素作出完全不同的反應。沒有庫函數會爲你做這些事情,因爲你需要用塊來改變一個以上的東西,以便像你想要的那樣靈活。總之:寫你的遞歸函數來做到這一點。

(順便說一句:你的數據結構的頂層是散列的數組,不是數組的哈希...)

0

我決定寫我自己的車輪(感謝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 

罰款!