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

求助:编写限制元素重复次数不超过n的数组处理函数(附错误代码)

修复限制数组元素重复次数的函数

你的代码问题分析

  1. 标签循环逻辑错误:使用first:标签跳过连续重复元素的方式,会导致每个元素仅在首次出现时被处理,后续相同元素的处理被跳过,但内部循环又会把该位置之后的所有相同元素全部加入结果,完全没做到次数限制。
  2. 计数变量未递增:内部循环里的count变量从未自增,导致count <3的条件始终成立,会把所有相同元素都推入结果数组,无法限制次数。
  3. 未封装为通用函数:硬编码了输入数组和n=3,不符合题目要求的“接收数组和数字n”的函数设计。

正确实现方案

下面是满足需求的函数,通过Map记录每个元素已加入结果的次数,遍历原数组时仅保留不超过n次的元素,同时保持原数组顺序:

function limitDuplicates(arr, n) {
  const result = [];
  const countTracker = new Map();

  for (const num of arr) {
    const currentCount = countTracker.get(num) || 0;
    if (currentCount < n) {
      result.push(num);
      countTracker.set(num, currentCount + 1);
    }
  }

  return result;
}

// 测试示例
const inputArr = [1, 2, 4, 4, 4, 2, 2, 2, 2];
const maxRepeat = 3;
console.log(limitDuplicates(inputArr, maxRepeat)); // 输出: [1, 2, 4, 4, 4, 2, 2]

基于你的代码修改版本

如果要保留你原有的循环思路,修改后的代码如下:

function limitDuplicates(arr, n) {
  const result = [];
  const countMap = {};

  for (let i = 0; i < arr.length; i++) {
    const currentNum = arr[i];
    // 初始化元素的计数
    if (!countMap[currentNum]) {
      countMap[currentNum] = 0;
    }
    // 计数未达上限则加入结果并更新计数
    if (countMap[currentNum] < n) {
      result.push(currentNum);
      countMap[currentNum]++;
    }
  }

  return result;
}

// 测试
const testArr = [1, 2, 4, 4, 4, 2, 2, 2, 2];
console.log(limitDuplicates(testArr, 3)); // 输出: [1, 2, 4, 4, 4, 2, 2]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 18:40:40