如何根据serial_number或name字段过滤复杂嵌套JSON数据
嵌套JSON查询实现方案
本实现支持serial_number和name两种查询条件,自动处理序列号前导零匹配问题,所有符合条件的记录都会完整返回,即使存在重复name也会返回全部匹配结果。
核心实现代码
// 参数说明:data 为待查询的嵌套JSON数组,query 为查询条件对象 function searchNestedData(data, query) { const result = []; // 遍历所有行政区 data.forEach(districtItem => { // 遍历行政区下的所有选区 districtItem.ward_no.forEach(wardItem => { // 合并当前选区下的grievance、general两类记录统一匹配 const allRecords = [...wardItem.grievance, ...wardItem.general]; allRecords.forEach(record => { let isMatch = false; // 按名称匹配 if (query.name) { isMatch = record.name === query.name; } // 按序列号匹配,自动忽略前导零 if (query.serial_number) { const targetSn = Number(query.serial_number); const recordSn = Number(record.serial_number); isMatch = targetSn === recordSn; } if (isMatch) { result.push(record); } }) }) }) return result; }
使用示例
1. 按名称查询
const queryByName = { name: "Bruno Fernandes" }; const nameResult = searchNestedData(原始JSON数据, queryByName); // 返回结果:[{serial_number: "0018", name: "Bruno Fernandes"}]
2. 按序列号查询
const queryBySn = { serial_number: "18" }; const snResult = searchNestedData(原始JSON数据, queryBySn); // 返回结果和按名称查询结果一致
扩展说明
如果需要同时返回匹配记录所属的行政区、选区信息,只需要在push结果时,把对应的districtItem.district、wardItem.ward字段合并到record对象中即可。
内容的提问来源于stack exchange,提问作者coolhack7
相关产品推荐
相关产品推荐

