2014-02-26 76 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