如何在JavaScript中高效查找嵌套JSON内首个SEARCH事件的Interest值
问题描述
我从API接口获取到如下JSON响应数据,该数据包含多个session节点,每个session节点下又包含多个event节点。我需要按顺序找到任意session中第一个type为"SEARCH"的event,若找到则提取该event下arbitraryData节点中的interest值。
目前我通过多层for循环实现了部分逻辑,但认为这种方式不够高效。
现有实现代码
var guestJson = await response.json(); for(var property in guestJson) { if(property === "sessions") { var sessionObj = JSON.parse(JSON.stringify(guestJson[property])) for(var i=0; i< sessionObj.length; i++) { var eachSessionObj = JSON.parse(JSON.stringify(sessionObj[i])) for(var sessionProperty in eachSessionObj) { if(sessionProperty === "events") { console.log("Events Found") //console.log(sessionProperty) } } } } }
JSON数据结构
{ "firstName":"fn", "lastName":"ln", "gender":"male", "sessions":[ { "currency":"USD", "events":[ { "type":"SEARCH", "status":"PROCESSED", "arbitraryData":{ "interest":"Health" } }, { "type":"CHECK", "status":"PROCESSED", "arbitraryData":{ "interest":"Dental" } } ] }, { "currency":"USD", "events":[ { "type":"SEARCH", "status":"PROCESSED", "arbitraryData":{ "interest":"Health" } }, { "type":"CHECK", "status":"PROCESSED", "arbitraryData":{ "interest":"Dental" } } ] } ] }
优化实现方案
可以利用数组的find()和some()方法实现高效查找,一旦找到目标就立即终止遍历,避免不必要的循环:
const guestJson = await response.json(); let targetInterest = null; // 遍历sessions,找到第一个包含SEARCH类型event的session guestJson.sessions.some(session => { // 在当前session的events中查找第一个SEARCH类型的event const searchEvent = session.events.find(event => event.type === "SEARCH"); if (searchEvent) { targetInterest = searchEvent.arbitraryData.interest; return true; // 找到后终止后续遍历 } return false; }); // 输出结果 if (targetInterest) { console.log("提取到的interest值:", targetInterest); } else { console.log("未找到符合条件的SEARCH类型event"); }
优化点说明
- 直接访问
guestJson.sessions,无需用for...in遍历所有对象属性 - 用
find()和some()方法实现短路遍历,找到目标后立即停止,避免无效循环 - 移除了原代码中多余的
JSON.parse(JSON.stringify())深拷贝操作,直接操作原对象即可
内容的提问来源于stack exchange,提问作者Jey
相关产品推荐
相关产品推荐

