如何在JavaScript中过滤JSON数据:排除含revert标签的CGI项
问题描述
我有一个包含cgi、tag、name键的JSON对象数组,其中cgi值可能重复。需求为:若某个cgi对应的任意对象中tag为'revert',则该cgi的所有对象都不返回。尝试使用filter方法未得到正确结果,请求正确实现方案。
输入示例
[ { "cgi": "abc-123", "tag": "revert", "name": "Piyush" }, { "cgi": "abc-123", "tag": null, "name": "Piyush" }, { "cgi": "abc-456", "tag": null, "name": "Piyush" }, { "cgi": "abc-789", "tag": null, "name": "Piyush" } ]
预期输出
[ { "cgi": "abc-456", "tag": null, "name": "Piyush" }, { "cgi": "abc-789", "tag": null, "name": "Piyush" } ]
错误尝试代码
data = data.filter(es => es.tag == 'filter')
实现方案
问题核心是需要先标记出所有关联tag: 'revert'的cgi,再整体排除这些cgi对应的所有对象,具体实现步骤如下:
- 收集需要排除的
cgi集合:过滤出所有tag为'revert'的对象,提取它们的cgi值并存入Set(自动去重)。 - 过滤原数组:保留所有
cgi不在排除集合中的对象。
正确代码示例
// 收集所有带有revert标签的cgi const forbiddenCgis = new Set( data.filter(item => item.tag === 'revert').map(item => item.cgi) ); // 过滤数组,排除所有属于禁入cgi的对象 const result = data.filter(item => !forbiddenCgis.has(item.cgi));
错误原因说明
你之前的代码仅尝试过滤tag等于'filter'的对象(疑似笔误,应为'revert'),但这种方式只能移除单个tag为'revert'的条目,无法关联同一cgi下的其他对象,所以无法满足需求。
内容的提问来源于stack exchange,提问作者Piyush
相关产品推荐
相关产品推荐

