js遍历树形结构

树形结构数据如下:

const treeData = [{
    title: '食品',
    name: '食品',
    key: '0-0',
    level: 0,
    type:'null',
    children: [
        {
            title: '饼干',
            name: '饼干',
            key: '0-0-0',
            level: 1,
            type:'null',
            children: [
                { title: '奥利奥', name:'奥利奥',key: '0-0-0-0',level:2,type:'hard',children:[{......}]},
                { title: '达能', name:'达能',key: '0-0-0-1',level:2,type:'soft' ,children:[{......}]},
                { title: '优冠', name:'优冠',key: '0-0-0-2' ,level:2,type:'soft',children:[{......}]},
            ],
        },
        {
            title: '糖果',
            name: '糖果',
            key: '0-0-1',
            level: 1,
            type:'null',
            children: [
                { title: '0-0-1-0', name:'徐福记',key: '0-0-1-0' ,level:2,type:'hard',children:[{......}]},
                { title: '0-0-1-1', name:'QQ糖',key: '0-0-1-1' ,level:2,type:'soft',children:[{......}]},
                { title: '0-0-1-2', name:'悠哈',key: '0-0-1-2' ,level:2,type:'hard',children:[{......}]},
            ],
        }
    ],
}];

如上述数据所示,数据层级不确定,可能有很多层。我想只遍历到level=2的这一层,并筛选出type='hard'的部分,type='soft'的部分以及其children全部省去,也就是说,处理之后数据变成这样:

const treeData = [{
    title: '食品',
    name: '食品',
    key: '0-0',
    level: 0,
    type:'null',
    children: [
        {
            title: '饼干',
            name: '饼干',
            key: '0-0-0',
            level: 1,
            type:'null',
            children: [
                { title: '奥利奥', name:'奥利奥',key: '0-0-0-0',level:2,type:'hard',children:[{......}]},
            ],
        },
        {
            title: '糖果',
            name: '糖果',
            key: '0-0-1',
            level: 1,
            type:'null',
            children: [
                { title: '0-0-1-0', name:'徐福记',key: '0-0-1-0' ,level:2,type:'hard',children:[{......}]},
                { title: '0-0-1-2', name:'悠哈',key: '0-0-1-2' ,level:2,type:'hard',children:[{......}]},
            ],
        }
    ],
}];

请问这个该怎么处理呢?

阅读 2.5k
2 个回答
function filterNodes (nodes = [], callbackfn) {
  const result = [];
  for (const node of nodes) {
    if (callbackfn(node)) {
      const children = filterNodes(node.children, callbackfn);
      result.push({ ...node, children });
    }
  }

  return result;
}

const filteredNodes = filterNodes(
  treeData,
  node => 2 >= node.level && "soft" !== node.type,
);

function customFilter(tree, filter = {level: 2, type: 'hard'}) {
  return tree.filter(item => item.level !== filter.level || item.type === filter.type).map(item => {
    item.children && ( item.children = customFilter(item.children, filter));
    return item;
  });
}

customFilter(treeData);

ps: 递规不熟, 看效果好像是能符合要求

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题