如何识别连续带标记ID并删除每3个连续标记中的中间ID
实现方案
逻辑说明
原有判断连续ID的逻辑可完全保留,仅需调整排序规则为升序(匹配IDList的排列顺序便于连续处理),再新增连续ID加工逻辑即可。核心加工规则:将连续ID每3个分为一组,每组删除中间的1个,剩余元素继续按该规则向后分组处理。
完整实现代码
// 原有筛选共有ID逻辑保持不变 let eqObj = {}; for (var i = 0; i < IDLISTPRD.length; i++) { if (IDList.includes(IDLISTPRD[i])) { eqObj[IDLISTPRD[i]] = IDList.indexOf(IDLISTPRD[i]); } } // 排序调整为升序,和IDList的顺序保持一致 let objSorted = Object.entries(eqObj).sort(function (a, b) { return a[1] - b[1]; }); // 原有判断是否存在3个连续ID的逻辑保持不变,仅调整差值计算顺序适配升序排列 let flagInRow = 0; let flagInRowIndicator = true; for (var i = 0; i < objSorted.length - 1; i++) { if (objSorted[i + 1][1] - objSorted[i][1] == 1) { flagInRow++; } else { flagInRow = 0; } if (flagInRow >= 2) { flagInRowIndicator = false; break; } } // 新增:按规则加工连续ID的逻辑 let processedIds = []; let currentContinuousCount = 0; for (let i = 0; i < objSorted.length; i++) { // 判断当前ID和上一个ID是否连续 const isContinuous = i > 0 ? (objSorted[i][1] - objSorted[i-1][1] === 1) : false; if (isContinuous) { currentContinuousCount++; } else { // 不连续则重置计数器,开启新的连续段计数 currentContinuousCount = 0; } // 连续计数为1时对应3个连续ID的中间位,跳过该元素 if (currentContinuousCount !== 1) { processedIds.push(objSorted[i][0]); // 处理完一组3个连续ID后,重置计数器适配下一组的计数 if (currentContinuousCount === 2) { currentContinuousCount = -1; } } } // processedIds即为最终处理后的ID数组 console.log(processedIds);
效果验证
- 输入3个连续ID:
["01","02","03"]→ 输出["01","03"],符合预期 - 输入6个连续ID:
["01","02","03","04","05","06"]→ 输出["01","03","04","06"],符合预期
内容的提问来源于stack exchange,提问作者user15564093
相关产品推荐
相关产品推荐

