如何修改filterByValue函数实现嵌套对象与数组的字符串搜索
实现支持数组与嵌套对象的深度筛选函数
filterByValue 需求背景
现有对象数组input,每个对象包含vertical(字符串)、platformList(数组)、radar_metadata(嵌套对象)三类属性。原filterByValue函数仅能筛选顶层属性的字符串,无法搜索数组元素、嵌套对象中的子串(如“Ident”“Clos”),需修改函数实现深度搜索能力。
解决方案:递归遍历所有层级数据
核心思路是通过递归函数,遍历对象的所有属性值,包括数组元素和嵌套对象,逐一检查是否包含目标搜索字符串。
原函数(仅支持顶层属性)
// 原函数:仅筛选顶层字符串属性 function filterByValue(input, searchTerm) { return input.filter(item => { return Object.values(item).some(val => typeof val === 'string' && val.includes(searchTerm) ); }); }
修改后的深度筛选函数
// 修改后:支持数组、嵌套对象的深度搜索 function filterByValue(input, searchTerm) { // 递归检查单个值是否匹配搜索词 const matchesSearch = (value) => { const lowerSearch = searchTerm.toLowerCase(); // 字符串类型:大小写不敏感匹配 if (typeof value === 'string') { return value.toLowerCase().includes(lowerSearch); } // 数组类型:遍历每个元素递归检查 if (Array.isArray(value)) { return value.some(item => matchesSearch(item)); } // 嵌套对象:遍历所有属性值递归检查 if (typeof value === 'object' && value !== null) { return Object.values(value).some(val => matchesSearch(val)); } // 其他类型(数字、布尔等)不参与匹配 return false; }; return input.filter(item => matchesSearch(item)); }
代码说明
递归辅助函数
matchesSearch:- 字符串:统一转小写实现大小写不敏感搜索(若需区分大小写,移除
toLowerCase()即可) - 数组:用
some遍历每个元素,递归调用检查 - 嵌套对象:遍历对象的所有属性值,递归调用检查
- 非字符串/数组/对象类型:直接返回
false
- 字符串:统一转小写实现大小写不敏感搜索(若需区分大小写,移除
使用示例
// 测试用input数组 const input = [ { vertical: "Aviation", platformList: ["Aircraft", "Radar System"], radar_metadata: { identifier: "RAD-123", location: "Closure Area" } }, { vertical: "Marine", platformList: ["Ship", "Buoy"], radar_metadata: { identifier: "MAR-456", location: "Open Sea" } } ]; // 搜索"Ident" → 匹配第一个对象(radar_metadata.identifier包含) console.log(filterByValue(input, "Ident")); // 搜索"Clos" → 匹配第一个对象(radar_metadata.location包含) console.log(filterByValue(input, "Clos")); // 搜索"Ship" → 匹配第二个对象(platformList包含) console.log(filterByValue(input, "Ship"));
可选扩展
- 若需支持数字转字符串匹配,可在辅助函数中添加:
if (typeof value === 'number') { return value.toString().includes(searchTerm); } - 若数据存在循环引用,需添加循环引用检测(比如用
Set记录已访问的对象),避免死循环。
内容的提问来源于stack exchange,提问作者Aren Trot
相关产品推荐
相关产品推荐

