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
相关产品推荐
相关产品推荐

