数组连续重复值替换为null的实现方案咨询
实现连续重复指定值的Null替换逻辑
针对你提出的三种替换规则,我们可以通过识别连续目标值的区间,再根据区间位置(开头/中间/末尾)分别处理的方式实现,下面是结合Lodash的具体实现方案:
核心思路
- 先遍历数组,找出所有连续出现目标值的区间(记录每个区间的起始和结束索引)
- 针对不同位置的区间应用对应规则:
- 开头区间:仅保留第二个元素,第一个及后续(若有)多余元素替换为
null - 末尾区间:仅保留倒数第二个元素,最后一个及前面(若有)多余元素替换为
null - 中间区间:仅保留首尾元素,中间所有元素替换为
null
- 开头区间:仅保留第二个元素,第一个及后续(若有)多余元素替换为
- 返回处理后的数组
代码实现
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
相关产品推荐
相关产品推荐

