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

发布于 2022-09-13 01:25:50 字数 666 浏览 25 评论 0

题目描述

需要写一个转换函数将一个树状的数据结构转换成同一层级(将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
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

信愁 2022-09-20 01:25:50

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);
}
╰つ倒转 2022-09-20 01:25:50
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));
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文