编辑代码


function filterEmptyNodes(nodes) {
    return nodes.reduce((acc, node) => {
        // 过滤当前节点,如果节点不为空,则加入到结果数组中
        if (node !== null && node !== undefined && node !== '') {
            const filteredChildren = node.folders ? filterEmptyNodes(node.folders) : [];
            acc.push({
                ...node,
                folders: filteredChildren
            });
        }
        return acc;
    }, []);
}

const updateFolderTreeItem = (operate, tree, item) => {
    // 回调获取tree里面的item并更新对应item
    const callback = tree => {

        for (let i = 0; i < tree.length; i++) {
            if (operate === 'add') {
                if (tree[i].id === item.parentId) {
                    tree[i].folders.push(item)
                } else if (tree[i].folders) {
                    callback(tree[i].folders)
                }
            } else if (operate === 'edit') {
                if (tree[i].id === item.id) {
                    tree[i] = { ...item, folders: tree[i].folders }
                } else if (tree[i].folders) {
                    callback(tree[i].folders)
                }
            } else if (operate === 'del') {
                if (tree[i].id === item.id && item.id !== 1) {
                    delete tree[i]
                } else if (tree[i].folders) {
                    callback(tree[i].folders)
                }
            }

        }
        if (operate === 'del') {
            tree = filterEmptyNodes(tree)
        }

        return tree
    };

    return callback(tree);
};

const a = [{
    "id": 1,
    "name": "Default",
    "path": "/",
    "parentId": 0,
    "description": "",
    "securityRef": 0,
    "type": 0,
    "folders": [
        {
            "id": 2,
            "name": "Development",
            "path": "/2",
            "parentId": 1,
            "description": "",
            "securityRef": 0,
            "type": 1,
            "folders": [
                {
                    "id": 20,
                    "name": "ggg",
                    "path": "/2/20",
                    "parentId": 2,
                    "description": "ddd",
                    "securityRef": 0,
                    "type": 1,
                    "folders": []
                }
            ]
        },
        {
            "id": 3,
            "name": "Database",
            "path": "/3",
            "parentId": 1,
            "description": "",
            "securityRef": 0,
            "type": 1,
            "folders": [
                {
                    "id": 21,
                    "name": "22",
                    "path": "/3/21",
                    "parentId": 3,
                    "description": "33",
                    "securityRef": 0,
                    "type": 1,
                    "folders": []
                },
                {
                    "id": 22,
                    "name": "33",
                    "path": "/3/22",
                    "parentId": 3,
                    "description": "44",
                    "securityRef": 0,
                    "type": 1,
                    "folders": []
                }
            ]
        }
    ]
}]

const item = {
    "id": 2,
    "name": "哈哈",
    "path": "/2/222",
    "parentId": 0,
    "description": "哈哈",
    "securityRef": 0,
    "type": 1,
    "folders": []
}

const res = updateFolderTreeItem('del', a, item)

console.log(JSON.stringify(res))