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) => {
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))