请教一个tree结构搜索算法

根据关键词匹配出树结构里节点
例如:

var tree = [
  {
    text: '设计',
    children: [
      {
        text: 'UI设计',
        children: [
          {
            text: '页面',
            children: []
          }
        ]
      },
      {
        text: '平面设计',
        children: [
          {
            text: '室内',
            children: []
          }
        ]
      }
    ]
  },
  {
    text: '数据统计',
    children: [
      {
        text: '百度统计',
        children: []
      },
      {
        text: '数据分析',
        children: [
          {
            text: '分析一',
            children: []
          },
          {
            text: '分析二',
            children: []
          },
          {
            text: '测试一',
            children: []
          }
        ]
      }
    ]
  }
];


// 输入
searchTreeData(tree, '测试');
// 输出
var res = [
  {
    text: '数据统计',
    children: [
      {
        text: '数据分析',
        children: [
          {
            text: '测试一',
            children: []
          }
        ]
      }
    ]
  }
];
阅读 2.2k
4 个回答
function filterMenuBySearchWord(menus, searchWord) {
    if (!menus) return
    
    const result = []
    
    menus.forEach(menu => {
        if (menu.text.includes(searchWord)) {
            result.push(menu)
            return
        }
        
        const children = filterMenuBySearchWord(menu.children, searchWord)
        
        if (children && children.length > 0) {
            result.push({...menu, children})
        }
    })
    return result
}
var tree = [
  {
    text: '设计',
    children: [
      {
        text: 'UI设计',
        children: [
          {
            text: '页面',
            children: []
          }
        ]
      },
      {
        text: '平面设计',
        children: [
          {
            text: '室内',
            children: []
          }
        ]
      }
    ]
  },
  {
    text: '数据统计',
    children: [
      {
        text: '百度统计',
        children: []
      },
      {
        text: '数据分析',
        children: [
          {
            text: '分析一',
            children: []
          },
          {
            text: '分析二',
            children: []
          },
          {
            text: '测试一',
            children: []
          }
        ]
      }
    ]
  }
];

function find(list, cb) {
  return list.reduce((res,item,index) => {
    if(cb(item,index)) res.push(item);
    else if(item.children) {
      const children = find(item.children, cb);
      if(children.length) res.push({...item,children});
    }
    return res;
  }, []);
}

find(tree, item => item.text.includes('测试'));

ps:使用filter也可以实现,但个人不喜欢在函数内部更改源数据。有兴趣可以自行研究

你的第一个变量tree怎么组合起来的,你应该搜索组合tree之前的那个数据,搜到符合条件的,再按照组合tree变量的方法,将搜索结果组合成你要的结构

推荐问题
宣传栏