如何根据指定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);
说明
some():检查对象的serviceTags中是否存在至少一个符合tagId的项,存在则保留该对象。map()+filter():对每个保留的对象,复制其所有属性,同时将serviceTags数组过滤为仅包含符合tagId的项。
内容的提问来源于stack exchange,提问作者samir
相关产品推荐
相关产品推荐

