【问题标题】:Flattening a Javascript dictionary, preserving the nested keys展平 Javascript 字典,保留嵌套键
【发布时间】:2014-03-29 14:53:42
【问题描述】:

我在 SO 上有用于展平数组 javascript 的方法,即将 [1,[2,3]] 转换为 [1,2,3]。但我正在寻找一种在保留键的同时展平字典的简洁方法。具体来说,我想要一个看起来像这样的字典:

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

要转换成:

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

确切的输出格式(字典、对列表等)并不重要,只要它清楚地将嵌套键的字符串与值相关联即可。就我的目的而言,假设没有一个键包含. 字符也是可以的,这样它就可以用来表示下一个键。

【问题讨论】:

  • underscorejs.org 有一些操作数据结构的有用函数。

标签: javascript dictionary


【解决方案1】:

此代码不使用全局变量来存储结果。

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

function flatten(obj, suffix, ans) {

  for (var x in obj) {
      var key;
      if (suffix != '')
        key = suffix + '.' + x;
      else
        key = x;
    if (typeof obj[x] === 'object') {
      flatten(obj[x], key, ans);
    } else {
      ans[key] = obj[x];
    }
  }
}
var x = {};
flatten(dict, "", x)
console.log(x)

【讨论】:

    【解决方案2】:
    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);
    

    希望这是你想要的。

    【讨论】:

      【解决方案3】:

      这是解决问题的另一种方法。

      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);
      

      【讨论】:

      • 这种方法比另一种方法有优势吗?它要长得多。
      • 另一个依赖于值是一个数字 - 我的方法不是。另一种方法还创建了一个全局变量result,其中我的被封闭,这样范围就不会被污染。
      • 如果值为Array,我的方法将失败。
      猜你喜欢
      • 2019-11-14
      • 2021-03-14
      • 2019-11-15
      • 2012-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-06
      • 1970-01-01
      相关资源
      最近更新 更多