如何在JavaScript中根据值过滤嵌套JSON数组对象
过滤嵌套结构的REST响应数据
需要对包含嵌套子对象的REST响应应用过滤规则,仅保留body.items[index].details.items中Id等于"300100619883728"的数组项,同时保持原数据结构不变。之前尝试的filter函数无法正确访问嵌套对象完成过滤。
原始JSON数据
{"error": null,"message": {"summary": ""},"status": 200,"headers": {},"body": {"items": [{"Name": "Test1","LastName": "ABC","details": {"items": [{"Id": "300100619883728","Status": "Draft","subDetails": {"items": [{"CurrentAddress": "Some address"}],"totalResults": 1,"count": 1,"hasMore": false,"limit": 25,"offset": 0}},{"Id": "300100619883738","Status": "Draft","subDetails": {"items": [{"CurrentAddress": "Some Address"}],"totalResults": 1,"count": 1,"hasMore": false,"limit": 25,"offset": 0}}],"totalResults": 2,"count": 2,"hasMore": false,"limit": 25,"offset": 0}},{"Name": "Test2","LastName": "ABC","details": {"items": [{"Id": "300100619883728","Status": "Draft","subDetails": {"items": [{"CurrentAddress": "Some address"}],"totalResults": 1,"count": 1,"hasMore": false,"limit": 25,"offset": 0}},{"Id": "300100619883739","Status": "Draft","subDetails": {"items": [{"CurrentAddress": "Some Address"}],"totalResults": 1,"count": 1,"hasMore": false,"limit": 25,"offset": 0}}],"totalResults": 2,"count": 2,"hasMore": false,"limit": 25,"offset": 0}}],"totalResults": 2},"ok": true,"statusText": "OK"}
期望过滤结果
{"error": null,"message": {"summary": ""},"status": 200,"headers": {},"body": {"items": [{"Name": "Test1","LastName": "ABC","details": {"items": [{"Id": "300100619883728","Status": "Draft","subDetails": {"items": [{"CurrentAddress": "Some address"}],"totalResults": 1,"count": 1,"hasMore": false,"limit": 25,"offset": 0}}],"totalResults": 2,"count": 2,"hasMore": false,"limit": 25,"offset": 0}},{"Name": "Test2","LastName": "ABC","details": {"items": [{"Id": "300100619883728","Status": "Draft","subDetails": {"items": [{"CurrentAddress": "Some address"}],"totalResults": 1,"count": 1,"hasMore": false,"limit": 25,"offset": 0}}],"totalResults": 2,"count": 2,"hasMore": false,"limit": 25,"offset": 0}}],"totalResults": 2},"ok": true,"statusText": "OK"}
尝试的错误代码
const filteredObj = obj.body.items.filter(function (item) { return item.details.items == 300100619883728; });
错误原因分析
- 直接将数组
item.details.items与ID值比较,逻辑错误,应该遍历该数组筛选符合条件的元素 - 原始数据中
Id是字符串类型,代码中使用数字300100619883728进行比较,类型不匹配 - 原代码仅过滤了
body.items数组,没有处理内部嵌套的details.items,且会破坏原数据结构
正确解决方案
先复制原对象避免修改原始数据,再逐层遍历嵌套结构,对details.items进行过滤:
// 深拷贝原对象,防止修改原始数据 const filteredResponse = JSON.parse(JSON.stringify(originalResponse)); // 遍历body中的每个items元素 filteredResponse.body.items.forEach(item => { // 过滤details.items,仅保留Id匹配的项 item.details.items = item.details.items.filter(detailItem => { return detailItem.Id === "300100619883728"; }); }); console.log(filteredResponse);
代码说明
- 使用
JSON.parse(JSON.stringify())深拷贝原响应对象,确保原始数据不被修改 - 通过
forEach遍历body.items中的每个对象 - 对每个对象的
details.items数组调用filter,筛选出Id严格等于目标字符串的元素 - 替换原
details.items为过滤后的数组,保持整体数据结构不变
内容的提问来源于stack exchange,提问作者mkchoube
相关产品推荐
相关产品推荐

