递归函数实现:检查多层对象中是否存在指定Link ID
修正后的函数实现
你的函数核心逻辑方向正确,但存在两个关键问题导致无法返回正确结果:
- 遍历子节点时使用
map,但未捕获递归调用的返回值,即便子节点匹配成功,上层函数也无法感知 - 缺少边界处理,若节点无
link或children属性,会触发运行时错误
以下是修正后的完整代码:
const isObject = (value: unknown): value is Record<string, any> => { return !!(value && typeof value === 'object' && !Array.isArray(value)) } const containsActiveLink = (linkObject: any = {}, pageIDToMatch: string): boolean => { // 边界校验:非对象或无link属性直接返回false if (!isObject(linkObject) || !linkObject.link) { return false } // 检查当前节点的link.id是否匹配 if (linkObject.link.id === pageIDToMatch) { return true } // 遍历子节点,只要有一个匹配就返回true if (Array.isArray(linkObject.children)) { return linkObject.children.some(child => containsActiveLink(child, pageIDToMatch)) } return false } // 测试示例 const sampleObj = { id: '55259494', menuText: 'Top level link', link: { id: '55259472', slug: 'lop-level-link', }, children: [ { id: '53664310', menuText: 'Product paths', link: { id: '51125095', slug: 'product-paths', }, children: [], }, { id: '53664355', menuText: 'Testing', link: { id: '51272081', slug: 'testing', }, children: [], }, { id: '53664382', menuText: 'Relay', link: { id: '51489535', slug: 'relay', }, children: [], }, { id: '55259577', menuText: 'About us', link: { id: '55259487', slug: 'about-us', }, children: [], }, ], } const isActiveLink = containsActiveLink(sampleObj, '51125095') console.log(isActiveLink) // 输出: true
关键修改说明
- 替换
map为some:some方法会在数组中找到第一个匹配元素时立即返回true并终止遍历,完美适配"只要存在匹配就返回"的需求 - 补充边界校验:提前过滤非对象节点、无
link的节点,避免访问undefined.id引发报错 - 优化类型定义:给
isObject添加类型断言,提升TypeScript类型推断准确性
内容的提问来源于stack exchange,提问作者Hantastic
相关产品推荐
相关产品推荐

