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

数组连续重复值替换为null的实现方案咨询

实现连续重复指定值的Null替换逻辑

针对你提出的三种替换规则,我们可以通过识别连续目标值的区间,再根据区间位置(开头/中间/末尾)分别处理的方式实现,下面是结合Lodash的具体实现方案:

核心思路

  1. 先遍历数组,找出所有连续出现目标值的区间(记录每个区间的起始和结束索引)
  2. 针对不同位置的区间应用对应规则:
    • 开头区间:仅保留第二个元素,第一个及后续(若有)多余元素替换为null
    • 末尾区间:仅保留倒数第二个元素,最后一个及前面(若有)多余元素替换为null
    • 中间区间:仅保留首尾元素,中间所有元素替换为null
  3. 返回处理后的数组

代码实现

const getTargetSequences = (arr, target) => {
  const sequences = [];
  let startIdx = -1;

  // 遍历数组,识别所有连续目标值的区间
  _.forEach(arr, (val, idx) => {
    if (val === target) {
      if (startIdx === -1) startIdx = idx;
    } else {
      if (startIdx !== -1) {
        sequences.push({ start: startIdx, end: idx - 1 });
        startIdx = -1;
      }
    }
  });

  // 处理数组末尾的连续目标值区间
  if (startIdx !== -1) {
    sequences.push({ start: startIdx, end: arr.length - 1 });
  }

  return sequences;
};

const replaceConsecutiveTarget = (arr, target) => {
  const resultArr = [...arr];
  const targetSequences = getTargetSequences(arr, target);

  // 逐个处理每个连续目标值区间
  _.forEach(targetSequences, (seq) => {
    const { start, end } = seq;
    const sequenceLength = end - start + 1;

    if (sequenceLength === 1) return; // 单个目标值,无需处理

    const isStartSequence = start === 0;
    const isEndSequence = end === arr.length - 1;

    if (isStartSequence) {
      // 开头区间:第一个元素设为null,第三个及以后的元素设为null
      resultArr[start] = null;
      for (let i = start + 2; i <= end; i++) {
        resultArr[i] = null;
      }
    } else if (isEndSequence) {
      // 末尾区间:最后一个元素设为null,开头到倒数第二个之前的元素设为null
      resultArr[end] = null;
      for (let i = start; i <= end - 2; i++) {
        resultArr[i] = null;
      }
    } else {
      // 中间区间:首尾保留,中间元素设为null
      for (let i = start + 1; i <= end - 1; i++) {
        resultArr[i] = null;
      }
    }
  });

  return resultArr;
};

测试示例

// 测试中间连续目标值
console.log(replaceConsecutiveTarget([1, 4, 3, 6, 6, 6, 6, 3, 2], 6));
// 输出:[1, 4, 3, 6, null, null, 6, 3, 2]

// 测试末尾连续目标值
console.log(replaceConsecutiveTarget([2, 6, 6, 6, 5, 2, 6, 6], 6));
// 输出:[2, 6, null, 6, 5, 2, 6, null]

// 测试开头连续目标值
console.log(replaceConsecutiveTarget([6, 6, 2, 3, 5, 6], 6));
// 输出:[null, 6, 2, 3, 5, 6]

补充说明

  • 代码通过复制原数组进行修改,不会影响原数组的引用
  • 针对单个出现的目标值,不会进行任何替换操作
  • 依赖Lodash的forEach方法简化遍历逻辑,也可以用原生数组forEach替代

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 08:40:33