树形数据模糊搜索

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

💩比如给你下面这些数据,展示关键字搜索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, '这就是最终过滤出来的数据')
   }
}
相关推荐
崔庆才丨静觅10 小时前
hCaptcha 验证码图像识别 API 对接教程
前端
你撅嘴真丑11 小时前
第九章-数字三角形
算法
passerby606111 小时前
完成前端时间处理的另一块版图
前端·github·web components
uesowys11 小时前
Apache Spark算法开发指导-One-vs-Rest classifier
人工智能·算法·spark
掘了11 小时前
「2025 年终总结」在所有失去的人中,我最怀念我自己
前端·后端·年终总结
崔庆才丨静觅11 小时前
实用免费的 Short URL 短链接 API 对接说明
前端
ValhallaCoder11 小时前
hot100-二叉树I
数据结构·python·算法·二叉树
董董灿是个攻城狮11 小时前
AI 视觉连载1:像素
算法
崔庆才丨静觅12 小时前
5分钟快速搭建 AI 平台并用它赚钱!
前端
智驱力人工智能12 小时前
小区高空抛物AI实时预警方案 筑牢社区头顶安全的实践 高空抛物检测 高空抛物监控安装教程 高空抛物误报率优化方案 高空抛物监控案例分享
人工智能·深度学习·opencv·算法·安全·yolo·边缘计算