
本文介绍一种递归式深度搜索方法,可精准匹配嵌套对象(如 `radar_metadata`)、数组(如 `platformlist`)及基础字段(如 `vertical`)中的任意子字符串,并完整返回匹配的顶层对象。
在实际前端开发中,常需对结构复杂的嵌套数据(如含对象、数组、深层属性的配置列表)实现模糊搜索功能。原始 filterByValue 函数仅支持顶层字段的字符串匹配,无法穿透 platformList 数组或 radar_metadata 嵌套对象——导致搜索 'Ident' 或 'Clos' 时失效。解决关键在于:将搜索逻辑递归化,统一处理对象、数组和原始值三种类型。
以下是优化后的通用深度搜索函数:
const filterByValue = (array, string) => {
return array.filter((obj) =>
Object.keys(obj).some((key) => {
const value = obj[key];
if (value === null || value === undefined) return false;
if (typeof value === 'object' && !Array.isArray(value)) {
// 递归搜索嵌套对象(如 radar_metadata)
return filterByValue([value], string).length > 0;
} else if (Array.isArray(value)) {
// 递归搜索数组项(如 platformList)
return filterByValue(value, string).length > 0;
} else {
// 基础类型:转字符串后执行忽略大小写的包含匹配
return String(value).toLowerCase().includes(string.toLowerCase());
}
})
);
};✅ 使用示例验证:
const input = [
{
vertical: "Partner",
platformList: ["Access"],
radar_metadata: { state: "Verify" }
},
{
vertical: "Integration",
platformList: ["Identity"],
radar_metadata: { state: "Closed" }
}
];
console.log(filterByValue(input, "Partner")); // → 匹配第1项(vertical)
console.log(filterByValue(input, "Ident")); // → 匹配第2项(platformList[0])
console.log(filterByValue(input, "Clos")); // → 匹配第2项(radar_metadata.state)⚠️ 注意事项:
- 该函数严格返回整个顶层对象(非部分字段),符合业务中“高亮整条记录”的常见需求;
- 自动跳过 null/undefined 值,避免 .toString() 报错;
- 使用 String(value) 替代 value.toString() 更安全(兼容 null/undefined);
- 递归深度由数据结构决定,对超深嵌套(>10层)建议增加深度限制以防止栈溢出;
- 如需提升性能,可预构建扁平化索引(如 searchIndex 字段),但会增加内存开销。
此方案兼顾简洁性与健壮性,无需引入 Lodash 等依赖,可直接集成至 React/Vue 的搜索组件逻辑中。










