treeData树形数据模糊搜索

需求: 在页面输入label,得到所有匹配的label和对应的父级

原始数据

  const a = [
    {
      id: '11',
      label: 'A系统',
      children: [
        {
          id: '11-21',
          label: '二级系统',
          children: [
            { id: '11-21-31', label: '三级系统01', children: null },
            { id: '11-21-32', label: '三级系统02', children: null },
          ],
        },
      ],
    },
    {
      id: '22',
      label: 'B系统',
      children: [
        {
          id: '22-21',
          label: '二级系统',
          children: [
            { id: '22-21-31', label: '三级系统03', children: null },
            { id: '22-21-32', label: '其他系统', children: null },
          ],
        },
      ],
    },
  ]

 

实现方法, 先递归得到匹配的ID

// 先拿到所有匹配的ID
  let selectIds = []
  const render = (data, label) => {
    let flag = false
    for (let i = 0; i < data.length; i++) {
      const item = data[i]
      if (item.label.indexOf(label) > -1) {
        console.log(item)
        selectIds.unshift(item.id)
        flag = true
      } else if (item.children && item.children.length) {
        if (render(item.children, label)) {
          selectIds.unshift(item.id)
          flag = true
        }
      }
    }
    return flag
  }

  render(a, '三级系统')
  console.log(1, selectIds) // ['22', '22-21', '22-21-31', '11', '11-21', '11-21-32', '11-21-31']

再通过ID筛选出符合的数据

// 根据ID匹配出树形数据
  const render2 = (data, newData) => {
    data.forEach((item) => {
      if (selectIds.includes(item.id)) {
        if (item.children && item.children.length) {
          item.children = render2(item.children, [])
        }
        newData.push(item)
      }
    })
    return newData
  }
  const searchData2 = render2(a, [])
  console.log(2, searchData2)

得到的数据

 

这样就可以了

posted @ 2022-06-24 09:46  潇湘羽西  阅读(493)  评论(0编辑  收藏  举报