树形数据模糊搜索

  • 根据关键字搜索树🌲型结构
  • 如果父级不含有关键字而子集含有,则父级也要展示
  • 如果父级不含有关键字且子集也不含有,则父级子集都不展示

💩比如给你下面这些数据,展示关键字搜索name的结果,你会怎么做🤔:

json 复制代码
 "data": [
        {
            "id": 23,
            "parentId": 0,
            "name": "主题b",
            "level": 1,
            "children": [
                {
                    "id": 24,
                    "parentId": 23,
                    "name": "主题",
                    "level": 2,
                    "children": [
                        {
                            "id": 25,
                            "parentId": 24,
                            "name": "主题",
                            "level": 3,
                        }
                    ]
                }
            ]
        },
        {
            "id": 27,
            "parentId": 0,
            "name": "主题d",
            "level": 1,
            "children": [
                {
                    "id": 28,
                    "parentId": 27,
                    "name": "主题d1",
                    "level": 2,
                }
            ]
        },
        {
            "id": 1,
            "parentId": 0,
            "name": "提款相关",
            "level": 1,
            "children": [
                {
                    "id": 2,
                    "parentId": 1,
                    "name": "提款问题-会员",
                    "level": 2,
                    "children": [
                        {
                            "id": 3,
                            "parentId": 2,
                            "name": "提款失败",
                            "level": 3,
                            "children": [
                                {
                                    "id": 4,
                                    "parentId": 3,
                                    "name": "提款失败-财务环节",
                                    "level": 4,
                                },
                                {
                                    "id": 5,
                                    "parentId": 3,
                                    "name": "提款失败-三方环节",
                                    "level": 4,
                                },
                                {
                                    "id": 6,
                                    "parentId": 3,
                                    "name": "提款失败-人工环节",
                                    "level": 4,
                                }
                            ]
                        }
                    ]
                }
            ]
        },
        {
            "id": 17,
            "parentId": 0,
            "name": "存款问题",
            "level": 1,
            "children": [
                {
                    "id": 18,
                    "parentId": 17,
                    "name": "存款-会员",
                    "level": 2,
                    "children": [
                        {
                            "id": 19,
                            "parentId": 18,
                            "name": "存款消息",
                            "level": 3,
                        }
                    ]
                }
            ]
        },
        {
            "id": 7,
            "parentId": 0,
            "name": "充值问题",
            "level": 1,
            "children": [
                {
                    "id": 8,
                    "parentId": 7,
                    "name": "充值问题-商户",
                    "level": 2,
                }
            ]
        },
        {
            "id": 20,
            "parentId": 0,
            "name": "主题a",
            "level": 1,
            "children": [
                {
                    "id": 21,
                    "parentId": 20,
                    "name": "主题a1",
                    "level": 2,
                    "children": [
                        {
                            "id": 22,
                            "parentId": 21,
                            "name": "主题a2",
                            "level": 3,
                        }
                    ]
                }
            ]
        },
        {
            "id": 26,
            "parentId": 0,
            "name": "主题",
            "level": 1,
        },
        {
            "id": 12,
            "parentId": 0,
            "name": "账号相关",
            "level": 1,
            "children": [
                {
                    "id": 13,
                    "parentId": 12,
                    "name": "信息安全",
                    "level": 2,
                    "children": [
                        {
                            "id": 14,
                            "parentId": 13,
                            "name": "修改信息问题",
                            "level": 3,
                            "children": [
                                {
                                    "id": 15,
                                    "parentId": 14,
                                    "name": "问题描述1",
                                    "level": 4,
                                }
                            ]
                        }
                    ]
                },
                {
                    "id": 16,
                    "parentId": 12,
                    "name": "账号冻结",
                    "level": 2,
                }
            ]
        }
    ],

🚀2、接下来我们直接上干货(这里面要思考一下下的🤔)

ini 复制代码
const filterDataByName = (name) => {
   if (name) {
      const filterData = [];
      const dripChildren = (arr, copyArr) => {
        const pick = new Set();
        for (let i = 0, len = arr.length; i < len; i++) {
          const { children, ...rest } = arr[i];
          if (arr[i].name.indexOf(name) > -1) {
            copyArr.push(rest);
          }
          
          if (children?.length) {
            rest.children = [];
            const finalChildren = dripChildren(children, rest.children);
            if (arr[i].name.indexOf(name) < 0) {
              if (!finalChildren && !rest.children.length) {
                rest.children = undefined;
              } else {
                copyArr.push(rest);
              }
            }
          } else {
            if (arr[i].name.indexOf(name) > -1) {
              pick.add(arr[i].id);
            }
          }
        }
        
        if (pick.size > 0) {
          return arr.filter((item) => pick.has(item.id));
        }
      }
      
      // data为原始数据
      // 当搜索关键词为空时,我们直接用原始数据data
      // 当搜索关键词不为空,我们用最终过滤的filterData
      
      dripChildren(data, filterData);
      
      console.log(filterData, '这就是最终过滤出来的数据')
   }
}
相关推荐
IT_陈寒23 分钟前
JavaScript性能优化:这7个V8引擎技巧让我的应用速度提升了50%
前端·人工智能·后端
学渣y36 分钟前
nvm下载node版本,npm -v查看版本报错
前端·npm·node.js
excel42 分钟前
首屏加载优化总结
前端
软件算法开发43 分钟前
基于黑翅鸢优化的LSTM深度学习网络模型(BKA-LSTM)的一维时间序列预测算法matlab仿真
深度学习·算法·lstm·时间序列预测·黑翅鸢优化·bka-lstm
小南家的青蛙43 分钟前
LeetCode第79题 - 单词搜索
算法·leetcode·职场和发展
PAK向日葵1 小时前
【算法导论】PDD 0928 笔试题解
算法·面试
敲代码的嘎仔1 小时前
JavaWeb零基础学习Day1——HTML&CSS
java·开发语言·前端·css·学习·html·学习方法
我爱计算机视觉3 小时前
ICCV 2025 (Highlight) Being-VL:师夷长技,用NLP的BPE算法统一视觉语言模型
人工智能·算法·语言模型·自然语言处理
Tachyon.xue3 小时前
Vue 3 项目集成 Element Plus + Tailwind CSS 详细教程
前端·css·vue.js
细节控菜鸡3 小时前
【2025最新】ArcGIS for JS二维底图与三维地图的切换
javascript·arcgis