如何实现嵌套对象数组全局搜索?递归代码栈溢出求助
嵌套对象数组全局搜索的正确实现方案(解决栈溢出问题)
原代码的问题解析
你遇到的栈溢出错误,核心原因是递归逻辑出现了无限循环:
- 处理嵌套对象时,错误地再次传入整个当前对象
inObjectSearch(obj),而非当前属性值obj[key],导致同一对象被反复递归遍历,最终耗尽调用栈。 - 数组处理逻辑冗余且错误:调用
recursiveObjArraySearch会重新触发整个数组过滤流程,不仅没必要,还会加剧递归层级。 - 递归调用未返回匹配结果:处理嵌套对象/数组时,没有将递归的匹配结果返回给
some方法,导致无法正确判断当前对象是否符合搜索条件。
正确实现代码
以下是修复后的方案,核心是实现一个通用的递归匹配函数,判断单个对象是否包含目标文本,再用filter筛选数组:
// 通用递归匹配函数:判断单个对象/值是否包含搜索文本 function matchesSearch(item, searchText) { const lowerSearch = searchText.toLowerCase(); // 处理字符串类型:忽略大小写匹配 if (typeof item === 'string') { return item.toLowerCase().includes(lowerSearch); } // 处理布尔类型:转为字符串匹配 if (typeof item === 'boolean') { return item.toString() === searchText; } // 处理数组:遍历数组元素,只要有一个匹配就返回true if (Array.isArray(item)) { return item.some(subItem => matchesSearch(subItem, searchText)); } // 处理对象(排除null,因为typeof null === 'object') if (typeof item === 'object' && item !== null) { return Object.values(item).some(value => matchesSearch(value, searchText)); } // 其他类型(如数字、null等)直接返回不匹配 return false; } // 全局搜索函数:筛选数组中所有匹配的对象 function globalSearch(arr, searchText) { return arr.filter(obj => matchesSearch(obj, searchText)); } // 示例使用 const locations = [ // 你的示例数据... ]; // 搜索"75" const result75 = globalSearch(locations, "75"); console.log(result75); // 返回所有包含"75"的对象 // 搜索"ja" const resultJa = globalSearch(locations, "ja"); console.log(resultJa); // 返回所有包含"ja"的对象
代码说明
matchesSearch函数负责递归遍历所有层级的属性值,覆盖字符串、布尔、数组、对象等多种类型,只要任意层级的值匹配搜索文本,就返回true。globalSearch函数利用数组的filter方法,结合matchesSearch筛选出所有符合条件的数组元素。- 避免了原代码中的无限递归问题,同时逻辑更简洁清晰,支持多种数据类型的匹配。
内容的提问来源于stack exchange,提问作者Mohammed Ahshan
相关产品推荐
相关产品推荐

