Skip to content

removeEmptyFloder #3

@jdz321

Description

@jdz321
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))
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions