JavaScript如何过滤MusicBrainz API返回JSON提取所需字段
解决方案
你可以直接用reduce结合Set实现单次遍历完成字段提取和title去重,时间复杂度为O(n),是效率最高的纯JS实现方式,直接替换你代码中trackReleases的赋值逻辑即可:
trackReleases: trackData["releases"].length ? (() => { // 用Set存储已出现的发行版标题,去重判断时间复杂度O(1) const existedTitles = new Set(); return trackData.releases.reduce((result, release) => { if (!existedTitles.has(release.title)) { existedTitles.add(release.title); // 仅保留需要的id和title字段 result.push({ id: release.id, title: release.title }); } return result; }, []); })() : "No information on releases",
如果你的数据量很小(发行版数量少于100个),也可以用更简洁的写法,不需要额外声明Set:
trackReleases: trackData["releases"].length ? trackData.releases.reduce((result, release) => { const isDuplicate = result.some(item => item.title === release.title); if (!isDuplicate) result.push({ id: release.id, title: release.title }); return result; }, []) : "No information on releases",
方案说明
- 不推荐用
map+filter的组合:该方案需要两次遍历数组,效率低于单次reduce遍历 - 不推荐用
forEach实现:需要额外在外部声明存储结果的数组和去重标记变量,代码零散度高于reduce的封装写法 - 两种方案都自动过滤了重复title的发行版,且只保留了需要的
id和title字段,完全符合需求
内容的提问来源于stack exchange,提问作者Bertrand B
相关产品推荐
相关产品推荐

