2014-02-26 106 views
0

我已經在SO上展開了一個數組javascript的方法,即將[1,[2,3]]轉換爲[1,2,3]。但是我正在尋找一種簡潔的方法來平坦化字典,同時保留鍵。具體而言,我想要一本字典,看起來像這樣:展平Javascript字典,保留嵌套鍵

{'key1':1,'key2':{'key3':2,'key4':3,'key5':{'key6':4}}} 

被轉換成:

{'key1':1, 'key2.key3':2,'key2.key4':3,'key2.key5.key6':4} 

確切的輸出格式(字典,對列表等)並不重要,只要因爲它明確地將嵌套鍵的字符串與一個值相關聯。出於我的目的,假定沒有任何密鑰包含.字符也可以,因此它可以用來表示下一個密鑰。

+0

underscorejs.org有一些有用的操作數據結構的函數。 – js1568

回答

4
var keys = {'key1':1,'key2':{'key3':2,'key4':3,'key5':{'key6':4}}}, result = {}; 


function serialize(keys, parentKey){ 
    for(var key in keys){ 
     if(parseInt(keys[key], 10)){ 
      result[parentKey+key] = keys[key]; 
     }else{ 
      serialize(keys[key], parentKey+key+"."); 
     } 
    } 
} 
serialize(keys, ""); 
console.log(result); 

希望這是你想要的。

0

這是另一種解決問題的方法。

var myDict = {'key1':1,'key2':{'key3':2,'key4':3,'key5':{'key6':4}}}; 

function flattenDict(dictToFlatten) { 
    function flatten(dict, parent) { 
     var keys = []; 
     var values = []; 

     for(var key in dict) { 
      if(typeof dict[key] === 'object') { 
       var result = flatten(dict[key], parent ? parent + '_' + key : key); 
       keys = keys.concat(result.keys); 
       values = values.concat(result.values); 
      } 
      else { 
       keys.push(parent ? parent + '_' + key : key); 
       values.push(dict[key]); 
      } 
     } 

     return { 
      keys : keys, 
      values : values 
     } 
    } 

    var result = flatten(dictToFlatten); 
    var flatDict = {}; 

    for(var i = 0, end = result.keys.length; i < end; i++) { 
     flatDict[result.keys[i]] = result.values[i]; 
    } 

    return flatDict; 
} 

flattenDict(myDict); 
+0

這種方法比其他方法有優勢嗎?時間更長。 –

+0

另一個依靠價值是一個數字 - 我的方法不是。此外,另一種方法是在封閉我的地方的情況下創建一個全局變量'result',以便範圍不受污染。 – kaspermoerch

+0

如果值是'Array',我的方法將失敗。 – kaspermoerch