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

如何实现嵌套对象数组全局搜索?递归代码栈溢出求助

嵌套对象数组全局搜索的正确实现方案(解决栈溢出问题)

原代码的问题解析

你遇到的栈溢出错误,核心原因是递归逻辑出现了无限循环:

  • 处理嵌套对象时,错误地再次传入整个当前对象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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 21:18:34