You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

数组过滤:如何在去重的同时获取每个商品的最高价格?

问题解决:按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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 16:47:34