通过在JavaScript中对数据进行分组来过滤JSON数据

s5a0g9ez  于 4个月前  发布在  Java
关注(0)|答案(2)|浏览(64)

我有一个json对象,关键字cgi, tag and name,其中cgi在任何多个对象中重复,如果任何cgi获得标记为'revert',那么cgi不应该返回。

[
  {
    "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')


abc-123被拒绝,因为第一个索引标签是'revert'。我试过使用过滤器,但它确实给了我适当的答案。

guz6ccqo

guz6ccqo1#

您可以使用reduce()创建一个包含所有已恢复的cgi值的集合。然后,您可以使用filter()删除此集合中所有不需要的值。

  • 除了Set,你也可以简单地使用一个数组。我使用了一个Set,这样我们就不会得到重复的值。
const data = [{"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"}];

// Get all `cgi` where tag is `revert`.
const revertedTags = data.reduce((acc, item) => {
  if(item.tag === 'revert') {
    acc.add(item.cgi);
  }

  return acc;
}, new Set());

// Filter out all elements who are present in `revertedTags` collection.
const filteredTags = data.filter((item) => !revertedTags.has(item.cgi));

// Result.
console.log(filteredTags);

字符串

h79rfbju

h79rfbju2#

一行程序:你可以使用一个memoized函数作为过滤器来过滤项目:

const data = [{"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"}];

const filteredTags = data.filter((map => e => map[e.cgi] ??= !data.find(e2 => e2.tag === 'revert' && e.cgi === e2.cgi))({}));

console.log(filteredTags);

字符串

相关问题