JavaScript如何筛选对象数组 保留每个price值首次出现的项
JS数组按price属性去重实现方案
要实现过滤掉price重复的对象、保留每个价格第一次出现的条目,核心是记录已经出现过的价格值,遍历过程中只保留首次遇到对应价格的对象即可,下面是两种常用的原生实现方式:
方案1:filter + Set(推荐,性能最优)
用Set结构做已出现价格的缓存,遍历一次数组就能完成去重,代码简洁且时间复杂度最低:
const offersStep = [ {a: 1, price: 67.10}, {a: 3, price: 88.20}, {a: 5, price: 88.20}, {a: 7, price: 57.10}, {a: 13, price: 57.10}, {a: 15, price: 57.10}, {a: 29, price: 57.10}, {a: 30, price: 57.10}, ] const seen = new Set() const offers = offersStep.filter(item => { if (seen.has(item.price)) return false seen.add(item.price) return true })
运行后offers的输出和你预期完全一致:
[ {a: 1, price: 67.10}, {a: 3, price: 88.20}, {a: 7, price: 57.10} ]
方案2:reduce 实现
如果偏好使用reduce做数组聚合,也可以用下面的写法,逻辑和方案1一致:
const offers = offersStep.reduce((result, currentItem) => { const priceExisted = result.some(item => item.price === currentItem.price) if (!priceExisted) result.push(currentItem) return result }, [])
提示:这个写法每次判断重复都要遍历已生成的结果数组,数据量很大时性能弱于Set方案,日常短数组场景使用没有问题。
内容的提问来源于stack exchange,提问作者Eduardo Raniero Silva
相关产品推荐
相关产品推荐

