You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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);

代码说明

  1. 使用JSON.parse(JSON.stringify())深拷贝原响应对象,确保原始数据不被修改
  2. 通过forEach遍历body.items中的每个对象
  3. 对每个对象的details.items数组调用filter,筛选出Id严格等于目标字符串的元素
  4. 替换原details.items为过滤后的数组,保持整体数据结构不变

内容的提问来源于stack exchange,提问作者mkchoube

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 11:14:55