You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript TreeNode搜索功能实现问询:构建符合规则的匹配子树方法

完善TreeNode的makeTreeForSearchQuery方法

我来帮你搞定这个方法,完全满足所有给定的要求,先看完整的实现代码,再拆解每个部分的逻辑:

class TreeNode {
  constructor(name) {
    this.name = name;
    this.children = [];
    this.expanded = false;
    this.matched = false;
  }

  makeTreeForSearchQuery(search) {
    // 处理空搜索的情况,同时统一转为小写实现大小写不敏感匹配
    const normalizedSearch = search?.toLowerCase() || '';
    const normalizedName = this.name.toLowerCase();

    // 创建当前节点的副本,绝对不修改原树的任何属性
    const newNode = new TreeNode(this.name);
    // 标记当前节点是否匹配搜索词
    newNode.matched = normalizedName.includes(normalizedSearch);

    // 递归处理所有子节点,筛选出需要保留的子节点
    const validChildren = [];
    for (const child of this.children) {
      const childResult = child.makeTreeForSearchQuery(search);
      // 如果子节点结果不为null,说明它或它的后代/祖先符合保留条件
      if (childResult) {
        validChildren.push(childResult);
      }
    }

    // 设置expanded属性:只要有子节点存在匹配的后代,就展开
    newNode.expanded = validChildren.some(child => child.matched || child.expanded);
    newNode.children = validChildren;

    // 判断当前节点是否需要保留:自身匹配,或者有符合条件的子节点
    if (newNode.matched || validChildren.length > 0) {
      return newNode;
    }

    // 自身不匹配且没有符合条件的子节点,返回null,上层不会保留这个节点
    return null;
  }
}

核心逻辑拆解

这个实现严格遵守了所有要求,我逐一对应解释:

1. 完全不修改原树

每次递归都创建一个全新的TreeNode副本,所有属性修改都在副本上操作,原树的节点、属性完全不受影响,完美满足要求1。

2. 大小写不敏感的包含匹配

把搜索词和节点名称都转为小写,用includes判断是否包含子串,而不是严格相等,完全符合要求2的“节点名称包含搜索子串(大小写不敏感)”。

3. 节点保留规则

一个节点会被保留在结果树中的条件是:

  • 自身匹配搜索词,或者
  • 有至少一个子节点被保留(意味着该子节点或它的后代匹配)
    这就满足了要求3:只要节点自身、祖先或后代有匹配,就会被保留——祖先的情况由上层递归处理,只要当前节点或后代符合,上层自然会把它加进去。

4. 正确设置matched属性

直接根据当前节点名称是否包含搜索词(大小写不敏感)来设置matched,匹配就设为true,否则false,满足要求4。

5. 正确设置expanded属性

遍历处理后的子节点,只要有任意一个子节点是matched(自身匹配)或者expanded(该子节点有匹配的后代),就说明当前节点有匹配的后代,把expanded设为true,否则false,完全符合要求5。

验证示例场景

当搜索词为'two'时,运行结果和你给出的预期完全一致:

  • root:自身不匹配,但子节点left被保留,所以expanded: true,matched: false
  • left:自身不匹配,但子节点two匹配,所以expanded: true,matched: false
  • two:自身匹配,matched: true,无符合条件的子节点,expanded: false
  • 其他节点(one、right等):自身不匹配且没有符合条件的子节点,返回null,不会出现在结果树中

原有代码的问题修复

你的原有代码有几个关键问题,我都在新实现里解决了:

  • 直接修改原树的this.children,违反了“不得修改原树”的要求;
  • 调用方法时缺少对象上下文(makeTreeForSearchQuery应该通过子节点实例调用);
  • 匹配逻辑是严格相等===,没有处理大小写不敏感和包含子串的情况;
  • 没有创建新节点副本,也没有正确判断节点是否需要保留。

内容的提问来源于stack exchange,提问作者DJ Danny

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 01:37:44