【JS】扁平树数据转为树结构

扁平数据

转为最终效果

js 复制代码
[{"label":"疼逊有限公司","code":"1212","disabled":false,"parentId":"none","children":[{"label":"财务部","code":"34343","disabled":false,"parentId":"1212"},{"label":"人事部","code":"43434","disabled":false,"parentId":"1212"},{"label":"经营 部","code":"53543","disabled":false,"parentId":"1212","children":[{"label":"市场部","code":"23232","disabled":true,"parentId":"53543"},{"label":"销售部","code":"3435435","disabled":false,"parentId":"53543"}]}]}]

js 复制代码
/**
 * 删除子级数据为空的子级
 * @param {[]} node 
 * @param {string} [childKey='children'] 子级字段 默认-children
 * @returns {[]}
 */
const removeNoneDataChildren = (node, childKey = 'children') => {
    const remove = nodeItem => {
        if (nodeItem[childKey] && nodeItem[childKey].length === 0) {
            delete nodeItem[childKey];
        } else if (nodeItem[childKey]) {
            nodeItem[childKey].forEach(remove);
        }

    }
    node.forEach(remove);
    return node
}

/**
 * 扁平数据转树结构
 * @param {[]} flatList 扁平化树的数据
 * @param {String} [idKey="id"] 主字段 默认-id
 * @param {String} [parentKey="parentId"] 父级字段 默认-parentId
 * @param {string} [childKey='children'] 子级字段 默认-children
 * @param {boolean} [delNoneDataChildren=true] 删除子级数据为空的子级 默认-true
 * @returns {[]}
 */
const buildTree = (flatList, idKey = 'id', parentKey = 'parentId', childKey = 'children', delNoneDataChildren = true) => {
    const map = {};
    const roots = [];

    flatList.forEach(item => {
        map[item[idKey]] = { ...item, [childKey]: [] };
    });

    flatList.forEach(item => {
        const itemId = item[idKey];
        const parentId = item[parentKey];

        if (parentId !== null && map[parentId]) {
            map[parentId][childKey].push(map[itemId]);
        } else {
            roots.push(map[itemId]);
        }
    });

    if (delNoneDataChildren) return removeNoneDataChildren(roots, childKey);
    return roots;
}


// 使用
const test =[{label:'疼逊有限公司',code:'1212',disabled:false,parentId:'none'},{label:'财务部',code:'34343',disabled:false,parentId:'1212'},{label:'人事部',code:'43434',disabled:false,parentId:'1212'},{label:'经营部',code:'53543',disabled:false,parentId:'1212'},{label:'市场部',code:'23232',disabled:true,parentId:'53543'},{label:'销售部',code:'3435435',disabled:false,parentId:'53543'}];
// 使用自定义字段
const tree = buildTree(test, 'code', 'parentId', 'children');
console.log("1 ~ tree:", JSON.stringify(tree))
相关推荐
To_OC8 小时前
写了三遍 Todo List,我终于搞懂了 React 父子组件到底怎么通信
前端·javascript·react.js
勇往直前plus9 小时前
Vue3(篇一) 核心概念——响应式模板语法与组件基础
前端·javascript·vue.js
用户9385156350710 小时前
从零搭建 AI 日记助手:用 Milvus 向量数据库 + RAG 让机器读懂你的每一天
javascript·人工智能·全栈
小Ti客栈10 小时前
Spring Boot 集成 Springdoc-OpenAPI 与 Knife4j实现接口文档与可视化调试
java·spring boot·后端
Sirens.10 小时前
MySQL表设计进阶-约束范式连接索引与事务
android·数据库·mysql
Ai拆代码的曹操11 小时前
Spring 事务 REQUIRES_NEW 嵌套调用:连接池翻倍的秘密
java·后端·spring
a11177611 小时前
坦克大战3D Three.js 3D (开源项目)
开发语言·javascript·3d
动恰客流统计11 小时前
ReID边缘计算视觉统计:餐饮店客流增长的数字化破局路径
java·大数据·运维·人工智能
kyriewen12 小时前
别再乱用useEffect了——你写的10个里有8个不该存在
前端·javascript·react.js
Ivanqhz12 小时前
Rust &‘static str浅析
java·前端·javascript·rust