let Arr = [
{ name: "1", type: "floder", children: [{ name: "1", type: "file" }] },
{
name: "2",
type: "floder",
children: [
{
name: "1",
type: "floder",
children: [
{
name: "1",
type: "floder",
children: [{ name: "1", type: "floder", children: [] }],
},
],
},
],
},
{
name: "3",
type: "floder",
children: [
{
name: "1",
type: "floder",
children: [{ name: "1", type: "floder", children: [] }],
},
],
},
];
function removeEmptyFloder(arr) {
const emptyFloder = []
const root = {
children: arr,
}
function walkTree(tree = [], parent) {
for (let node of tree) {
node.parent = parent
if (node.children && node.children.length) {
walkTree(node.children, node)
}
// mark empty floder
if (node.type === 'floder') {
if (!node.children || node.children.length === 0) {
emptyFloder.push(node)
}
}
}
}
walkTree(arr, root)
function removeSelf(node) {
if (node.parent) {
node.parent.children = node.parent.children.filter(item => item !== node)
if (node.parent.children.length === 0) {
removeSelf(node.parent)
}
}
}
emptyFloder.forEach(removeSelf)
return JSON.parse(JSON.stringify(root.children, (key, value) => key === 'parent' ? undefined : value))
}