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
相关产品推荐
相关产品推荐

