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

JavaScript如何实现数组按分类保留最多2个对象并删除多余元素

实现方案

通过一次遍历+计数的方式就能实现需求,不需要额外做分组拆分再合并的操作,逻辑简单性能也高:

  • 用一个普通对象存储每个category已经被保留的元素个数
  • 遍历原数组时,判断当前元素所属分类的已保留数量,不足2个就加入结果数组,同时计数+1,超过2个直接跳过即可

保留每个分类下最先出现的2个元素

直接用数组的filter方法就能实现,最终结果和你给出的预期输出完全一致:

const myArray = [ 
  {
    title: 'title',
    category: 'genetic-diseases'
  },
  {
    title: 'title',
    category: 'genetic-disorders'
  },
  { title: 'title', category: 'genetic-disorders' },
  {
    title: 'title',
    category: 'genetic-disorders'
  },
  {
    title: 'title',
    category: 'genetic-mutation'
  },
  {
    title: 'title',
    category: 'genetic-mutation'
  },
  {
    title: 'title',
    category: 'genetic-mutation'
  }
]

const categoryCounter = {};
const result = myArray.filter(item => {
  const count = categoryCounter[item.category] ?? 0;
  if (count < 2) {
    categoryCounter[item.category] = count + 1;
    return true;
  }
  return false;
});

// result就是你需要的最终结果数组

拓展:保留每个分类下最后出现的2个元素

如果你需要保留每个分类靠后的2个元素,只需要先复制原数组做反转,过滤完成后再反转回来即可:

const categoryCounter = {};
const result = [...myArray].reverse().filter(item => {
  const count = categoryCounter[item.category] ?? 0;
  if (count < 2) {
    categoryCounter[item.category] = count + 1;
    return true;
  }
  return false;
}).reverse();

两种写法都不会修改原数组,返回的是全新的结果数组,避免副作用影响原数据。

内容的提问来源于stack exchange,提问作者Mehdi Faraji

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 03:12:19