繁体   English   中英

展平 Javascript 字典,保留嵌套的键

[英]Flattening a Javascript dictionary, preserving the nested keys

我在 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}

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

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

希望这是你想要的。

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

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

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

 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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM