【数据结构】JS利用递归将树状的结构对象铺平

Smile丶
  • 15

题目描述

需要写一个转换函数将一个树状的数据结构转换成同一层级(将data转换成result),通过-来分隔层级

const data = {
    a:1,
    b:{
        '1': 2,
        '2': {
            '1': 3,
            '2': 4,
        }
    },
    c: {
        '1':{
            '1':{
                '1': 5,
                '2': 8,
            },
            '2': 6,
            '3':{
                '1':{
                    '2': 9
                }
            }

        },
        '2': 7
    }
}

const result = {
    'a': 1,
    'b-1':2,
    'b-2-1':3,
    'b-2-2':4,
    'c-1-1-1': 5,
    'c-1-2':6,
    'c-2':7,
    'c-1-1-2': 8,
    'c-1-3-1-2':9
}
回复
阅读 306
2 个回答

image.png

{
    const data = {
        a: 1,
        b: {
            '1': 2,
            '2': {
                '1': 3,
                '2': 4,
            }
        },
        c: {
            '1': {
                '1': {
                    '1': 5,
                    '2': 8,
                },
                '2': 6,
                '3': {
                    '1': {
                        '2': 9
                    }
                }

            },
            '2': 7
        }
    }

    const result = {
        'a': 1,
        'b-1': 2,
        'b-2-1': 3,
        'b-2-2': 4,
        'c-1-1-1': 5,
        'c-1-2': 6,
        'c-2': 7,
        'c-1-1-2': 8,
        'c-1-3-1-2': 9
    }
    const isType = (obj, type = '') => Object.prototype.toString.call(obj) === `[object ${type}]`;
    const treeToArr = (data = {}, keys = [], res = {}) => 
            (Object.entries(data).forEach(([key, obj]) => 
                (keys.push(key), isType(obj, 'Object') ? 
                    treeToArr(obj, keys, res) : 
                    (res[keys.join('-')] = obj), keys.pop())), res)
    treeToArr(data);
}
function transform(obj) {
    var ret = {};
    for (var stack = [{ cache: obj }]; stack.length;) {
        var tmp = stack.pop();
        for (var key in tmp.cache) {
            var val = tmp.cache[key];
            if (tmp.key) key = tmp.key + "-" + key;
            if (typeof val === "object" && val) {
                stack.push({ cache: val, key: key });
            } else {
                ret[key] = val;
            }
        }
    } 
    return ret;
}
console.dir(transform(data));
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
你知道吗?

宣传栏