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

TypeScript技术咨询:遍历类型化数组与嵌套数组对象查找函数疑问

TypeScript技术咨询:遍历类型化数组与嵌套数组对象查找函数疑问

嘿,我注意到你写了一个用来在无限层级(或未知层级)的嵌套对象数组中查找指定父对象的TypeScript函数,先把你贴出的代码片段规整一下,看起来代码没写完,先展示你给出的部分:

const findActualParent = (parentId:Number, serviceList: Service[] | Service) =>{
    for (const service of serviceList){
        if(service.id == parentId){
            return service
        }
        if(service.children?.length>0){
            let actualParent: Service = findActualParent(parentId, service.children)!
            return actualParent!
        }
    }
}

我发现这个函数目前存在几个小问题,可能会导致查找逻辑出错:

  • 递归逻辑漏洞:当你递归调用findActualParent后直接return,哪怕递归没找到目标对象,也会直接终止当前层级的遍历,跳过后续的兄弟节点,这样如果目标对象在当前节点的下一个兄弟节点的子树里,就会找不到
  • 类型注解的小问题:parentId的类型你写了Number,在TypeScript里我们一般用小写的number来标注基本数值类型,大写的Number是包装对象类型,很少用在这种场景
  • 单对象遍历的问题:serviceList的类型是Service[] | Service,但如果传入的是单个Service对象,for...of循环会报错,因为单个对象不是可迭代的

这里给你调整后的版本,修复了这些问题:

// 先假设Service类型的定义大概是这样(如果你的定义不同可以自行调整)
interface Service {
  id: number;
  children?: Service[];
  // 可以添加你的其他属性
}

const findActualParent = (parentId: number, serviceList: Service[] | Service): Service | undefined => {
  // 先把单个Service对象转换成数组,统一遍历逻辑
  const services = Array.isArray(serviceList) ? serviceList : [serviceList];

  for (const service of services) {
    // 找到匹配的直接返回
    if (service.id === parentId) {
      return service;
    }
    // 如果有子节点,递归查找
    if (service.children?.length) {
      const found = findActualParent(parentId, service.children);
      // 只有递归找到结果的时候才返回,没找到就继续遍历当前层级的其他节点
      if (found) {
        return found;
      }
    }
  }
  // 遍历完所有节点都没找到,返回undefined
  return undefined;
};

简单说下调整点:

  • 统一了serviceList的处理逻辑,不管传入的是数组还是单个对象,都转成数组来遍历,避免遍历错误
  • 修正了递归的返回逻辑:只有当递归调用找到目标对象时才返回,没找到就继续遍历当前层级的下一个节点
  • 调整了parentId的类型为number,符合TypeScript的常规写法
  • 给函数添加了明确的返回类型Service | undefined,去掉了不安全的非空断言!,让类型更严谨

这样调整后,函数就能正确遍历所有层级的节点,精准找到目标对象啦~

备注:内容来源于stack exchange,提问作者EcmaScriptIsMyNativeLanguage

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.13 17:43:10