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

如何根据指定tagId数组过滤JSON对象数组并保留匹配的serviceTags

根据tagId过滤JSON对象数组并筛选对应serviceTags

原始数据

const data = [
  {
    "uniqueId": 1233,
    "serviceTags": [
      {
        "Id": 11602,
        "tagId": "FRRRR",
        "missingRequired": [],
        "summaries": [
          { "contract": "ACTIVE" },
          { "contract": "INACTIVE" }
        ],
        "lttributes": {}
      }
    ]
  },
  {
    "uniqueId": 34555,
    "serviceTags": [
      {
        "Id": 11602,
        "tagId": "JWJN2",
        "missingRequired": [],
        "summaries": [
          { "contract": "ACTIVE" },
          { "contract": "INACTIVE" }
        ],
        "lttributes": {}
      }
    ]
  },
  {
    "uniqueId": 44422,
    "serviceTags": [
      {
        "Id": 11602,
        "tagId": "ABC",
        "missingRequired": [],
        "summaries": [
          { "contract": "ACTIVE" },
          { "contract": "INACTIVE" }
        ],
        "lttributes": {}
      },
      {
        "Id": 11602,
        "tagId": "BBC",
        "missingRequired": [],
        "summaries": [
          { "contract": "ACTIVE" },
          { "contract": "INACTIVE" }
        ],
        "lttributes": {}
      }
    ]
  }
]

过滤条件

const tagId = ['ABC','FRRRR'];

预期输出

[
  {
    "uniqueId": 1233,
    "serviceTags": [
      {
        "Id": 11602,
        "tagId": "FRRRR",
        "missingRequired": [],
        "summaries": [
          { "contract": "ACTIVE" },
          { "contract": "INACTIVE" }
        ],
        "lttributes": {}
      }
    ]
  },
  {
    "uniqueId": 44422,
    "serviceTags": [
      {
        "Id": 11602,
        "tagId": "ABC",
        "missingRequired": [],
        "summaries": [
          { "contract": "ACTIVE" },
          { "contract": "INACTIVE" }
        ],
        "lttributes": {}
      }
    ]
  }
]

错误尝试

const r = data.filter(d => d.serviceTags.every(c => tagId.includes(c.tagId)));
console.log(r);

错误原因

使用every()会要求当前对象的所有serviceTags都在目标tagId数组中才会被保留,但实际需求是只要对象有至少一个符合条件的serviceTags就保留,同时还要过滤掉该对象下不符合的serviceTags项。

正确实现方法

const filteredData = data
  // 先筛选出至少有一个符合tagId的serviceTags的对象
  .filter(item => item.serviceTags.some(tag => tagId.includes(tag.tagId)))
  // 对每个保留的对象,过滤其serviceTags只保留符合条件的项
  .map(item => ({
    ...item,
    serviceTags: item.serviceTags.filter(tag => tagId.includes(tag.tagId))
  }));

console.log(filteredData);

说明

  1. some():检查对象的serviceTags中是否存在至少一个符合tagId的项,存在则保留该对象。
  2. map() + filter():对每个保留的对象,复制其所有属性,同时将serviceTags数组过滤为仅包含符合tagId的项。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 11:31:06