树形结构数据如何删除空的子级节点?

我有这样一组数据,想要递归删除掉所有 children 为空的节点,对于这组数据来说,最后删除完后,会得到空数据。

但是我设计的方法好像行不通,请大家帮忙给我个思路,或者说帮忙指出我这段程序中有什么错误的地方,不胜感激:

数据

data = [
    {id: 1, label: '1-1', children: 
        [
            {id: 2, label: '1-2', children: []},
            {id: 3, label: '1-3', children: []},
        ]
    },
    {id: 4, label: '2-1', children: []},
];

尝试的方法

function getSelectedNode(nodeData, parent) {
  nodeData.forEach(item => {
    if ('children' in item && item.children.length === 0) {
      // 使用了lodash的删除方法
      lodash.remove(parent.children, o => {
        return o.id === item.id
      })
    } else if ('children' in item && item.children.length) {
      getSelectedNode(item.children, item);
    }
  })
}
getSelectedNode(data, data);
阅读 9.7k
4 个回答
function deleteEmpty(list) {
  for (let i = list.length - 1; i >= 0; i--) {
    const item = list[i];
    if (!item.hasOwnProperty('children')) continue;
    if (item.children.length === 0) {
      list.splice(i, 1);
      continue;
    }
    deleteEmpty(item.children);
  }
}

既然已经遍历到了,为什么不直接删掉呢?

function getSelectedNode(nodeData, parent) {
  nodeData.forEach(item => {
    if ('children' in item && item.children.length === 0) {
      delete item.children
    } else if ('children' in item && item.children.length) {
      getSelectedNode(item.children, item);
    }
  })
}
getSelectedNode(data, data);
function loopTree(data, parent, index) {

 data.forEach((item, index) => {

 if (item.chidren instanceof Array && item.children.length === 0) {

 parent && parent.children.splice(index, 1)

 }

 item.children && item.children.length > 0 && loopTree(item.children, item, index)

 })

 return data

}
推荐问题
宣传栏