算法小问题:指定类型数组转换成对象的问题。

发布于 2022-09-06 04:36:09 字数 1110 浏览 16 评论 0

有如下形式的二维数组:

array = [
    ["北京市","海淀区"],
    ["北京市","东城区"],
    ["辽宁省","沈阳市","和平区"],
    ["辽宁省","沈阳市","铁西区"],
    ["台湾省"]
]

需要将上面的数组转换成一个指定格式的对象object:

targetObject = {
    text:"",
    children: [
        {
            text: '北京市',
            children: [
                {
                    text: '海淀区',
                    children: [],
                },{
                    text: '东城区',
                    children: []
                }
            ]
        },{
            text: '辽宁省',
            children: [
                {
                    text: '沈阳市',
                    children: [
                        {
                            text: '和平区',
                            children: []
                        },{
                            text: '铁西区',
                            children: []
                        }
                    ]
                }
            ]
        },{
            text: '台湾省',
            children: []
        }
    ]
}

可能看起来有点复杂,不过思路应该还是挺清晰的,应该是一个递归的过程,但是本人算法是在不是很好,求大神给一个解决方案

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

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

发布评论

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

评论(1

如梦亦如幻 2022-09-13 04:36:09
const array = [
    ["北京市", "海淀区"],
    ["北京市", "东城区"],
    ["辽宁省", "沈阳市", "和平区"],
    ["辽宁省", "沈阳市", "铁西区"],
    ["台湾省"]
];

function convert(list) {
    // map 用来保存已处理节点的字典,
    // 键是城市的全路径(/分隔),
    // 值是根据城市名称产生的对象
    const map = {};

    // 根节点对象
    const root = {
        text: "",
        children: []
    };

    list.forEach(parts => {
        // 对 parts 中的每一个城市进行处理
        // reduce 主要用于拼接 key,即全路径
        parts.reduce((parentKey, name) => {
            // 根据父节点的 key 和当前城市名称拼接当前城市 key
            const key = `${parentKey}/${name}`;

            // 如果节点已经存在,直接跳过
            if (!map[key]) {
                // 先用 parentKey 找到父节点,如果没有,用 root 作为父节点
                const parent = map[parentKey] || root;

                // 产生子节点对象
                const node = {
                    text: name,
                    children: []
                };

                // 将子节点对象加入 map 和父节点的 children
                map[key] = node;
                parent.children.push(node);
            }

            return key;
        }, "");
    });

    return root;
}

const r = convert(array);
console.log(JSON.stringify(r, null, 4));
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文