求助开发支持多参数查询的多级JSON结构搜索函数
多级JSON深度搜索与多参数查询函数改造
需求概述
- 支持多级嵌套JSON结构的深度搜索
- 支持多参数组合查询(如同时匹配
SKU和punctuation字段) - 匹配到的多个结果自动存入数组返回
示例嵌套JSON结构
[ [ { "name": "brush", "punctuation": 20, "componets": [ { "SKU": "24AC", "name": "toothbrush", "type": "cleaning item" }, { "SKU": "23AC", "name": "hair brush", "type": "cleaning item" } ] }, { "name": "glue", "punctuation": 15, "componets": [ { "SKU": "24Ak", "name": "paper glue", "type": "hardware store" }, { "SKU": "23Ak", "name": "floor glue", "type": "hardware store" } ] } ] ]
原函数的局限
原函数仅能遍历JSON结构的第一层,无法处理嵌套的对象或数组:
search(dataSearch:any, objectData:any){ let result = objectData.filter((data:any) => { return Object.keys(data).some((key:any) =>{ return JSON.stringify(data[key]).trim().includes(dataSearch); }); }); }
改造后的深度搜索函数
以下函数通过递归遍历实现多级JSON搜索,同时支持单参数和多参数组合查询:
function deepSearch(query: string | Record<string, any>, data: any): any[] { const results: any[] = []; // 递归遍历所有嵌套元素 const traverse = (item: any) => { if (!item) return; // 判断当前元素是否匹配查询条件 let isMatch = false; if (typeof query === 'string') { // 单字符串查询:检查当前元素的所有字段值是否包含目标字符串 isMatch = Object.values(item).some(val => typeof val === 'string' ? val.includes(query) : JSON.stringify(val).includes(query) ); } else { // 多参数查询:检查当前元素是否匹配所有指定的键值对 isMatch = Object.entries(query).every(([key, value]) => item[key] === value); } // 匹配成功则加入结果数组 if (isMatch) results.push(item); // 递归处理子元素:数组遍历每个元素,对象遍历所有属性值 if (Array.isArray(item)) { item.forEach(traverse); } else if (typeof item === 'object') { Object.values(item).forEach(traverse); } }; // 启动遍历 traverse(data); return results; }
使用示例
1. 单参数搜索
查找所有包含"24AC"的元素:
const sampleData = [/* 示例JSON结构 */]; const singleParamResult = deepSearch("24AC", sampleData); console.log(singleParamResult); // 输出:[{"SKU":"24AC","name":"toothbrush","type":"cleaning item"}]
2. 多参数组合搜索
查找punctuation=20且SKU="23AC"的元素:
const multiParamResult = deepSearch({punctuation: 20, SKU: "23AC"}, sampleData); console.log(multiParamResult); // 输出:[{"SKU":"23AC","name":"hair brush","type":"cleaning item"}]
内容的提问来源于stack exchange,提问作者Esperanza Wiesse Gutierrez
相关产品推荐
相关产品推荐

