数组过滤:如何在去重的同时获取每个商品的最高价格?
问题解决:按Item去重并保留最高价格
嘿,我来帮你搞定这个需求!你现在有这么一个商品数组:
const store = [ { "item": "shirt", "price": 20 }, { "item": "shirt", "price": 50 }, { "item": "pants", "price": 10 }, { "item": "pants", "price": 20 } ];
之前你用filter配合findIndex实现了按item字段去重,但现在想在同一处理流程里,直接拿到每个item对应的最高价格,最终得到[{ "item": "shirt", "price": 50 }, { "item": "pants", "price": 20 }]对吧?
最推荐的方法是用Array.reduce(),它能一次遍历就完成分组和取最大值的操作,效率比多次遍历高很多,逻辑也清晰:
方法一:使用reduce实现高效处理
思路是用一个对象当“临时仓库”,键是商品名称(item),值是当前该商品价格最高的对象。遍历数组时,对比当前元素和临时仓库里对应商品的价格,保留价格更高的那个,最后把临时仓库里的内容转成数组就是结果:
const result = Object.values(store.reduce((acc, current) => { // 如果当前商品不在临时仓库,或者当前价格比仓库里的高,就更新 if (!acc[current.item] || current.price > acc[current.item].price) { acc[current.item] = { ...current }; // 浅拷贝原对象,避免修改原数组元素 } return acc; }, {})); console.log(result); // 输出:[{ "item": "shirt", "price": 50 }, { "item": "pants", "price": 20 }]
方法二:基于你原有的filter方法修改
如果你想在自己原来的代码基础上调整,也可以这么做——不过这种方法需要嵌套遍历,数组大的时候性能会差一些:
const result = store.filter((v, i, a) => { // 先找出当前item的所有元素,计算最高价格 const sameItems = a.filter(item => item.item === v.item); const maxPrice = Math.max(...sameItems.map(item => item.price)); // 只保留价格等于最大值的第一个元素 return v.price === maxPrice && a.findIndex(item => item.item === v.item && item.price === maxPrice) === i; }); console.log(result);
对比下来,reduce的方法显然更优:只需要遍历数组一次,时间复杂度是O(n),而filter嵌套的方法是O(n²),数据量大的时候差异会很明显。
内容的提问来源于stack exchange,提问作者Ahmad
相关产品推荐
相关产品推荐

