【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))
相关推荐
wellc13 分钟前
SpringBoot集成Flowable
java·spring boot·后端
wellc36 分钟前
MySQL Workbench菜单汉化为中文
android·数据库·mysql
Hui Baby1 小时前
springAi+MCP三种
java
hsjcjh1 小时前
【MySQL】C# 连接MySQL
java
敖正炀1 小时前
LinkedBlockingDeque详解
java
wangyadong3171 小时前
datagrip 链接mysql 报错
java
untE EADO1 小时前
Tomcat的server.xml配置详解
xml·java·tomcat
ictI CABL1 小时前
Tomcat 乱码问题彻底解决
java·tomcat
敖正炀1 小时前
DelayQueue 详解
java
CYY951 小时前
Android 打印 SO 库的异常日志
android