JavaScript数组邻近值与中间值提取代码错误排查求助
问题排查与修复
现有代码的核心问题
- 未实现「中间值(In Between)」逻辑:预期输出中的
1、3、33都来自排序后数组相邻元素的中间数(如0和2之间的1,2和4之间的3,32和34之间的33),现有代码完全缺失这部分处理。 - 邻近值逻辑的冗余与边界处理:
- 原数组未去重,导致重复处理相同元素(如多次处理8、9),虽然后续去重不影响结果,但效率低下。
- 使用
indexOf判断元素存在性,效率远低于Set的has方法。
- 邻近值的判断逻辑虽能覆盖部分场景,但未结合去重后的数组进行判断,导致逻辑上的冗余重复。
修复后的代码
const lookAtNumber = [10, 0, 15, 18, 25, 8, 2, 4, 9, 9, 14, 34, 8, 32]; // 先对原数组去重并排序,方便后续处理 const uniqueSortedArr = [...new Set(lookAtNumber)].sort((a, b) => a - b); const numberSet = new Set(uniqueSortedArr); const sureHit = []; // 处理邻近值(Closet) uniqueSortedArr.forEach(item => { const prev = item - 1; const next = item + 1; const hasPrev = numberSet.has(prev); const hasNext = numberSet.has(next); // 某一侧相邻数存在,另一侧不存在 if (hasPrev && !hasNext) { sureHit.push(next); } else if (!hasPrev && hasNext) { sureHit.push(prev); } }); // 处理中间值(In Between) for (let i = 0; i < uniqueSortedArr.length - 1; i++) { const current = uniqueSortedArr[i]; const next = uniqueSortedArr[i + 1]; // 相邻元素差为2时,中间的数即为目标 if (next - current === 2) { sureHit.push(current + 1); } } // 去重并排序(确保结果有序且无重复) const finalResult = [...new Set(sureHit)].sort((a, b) => a - b); console.log(finalResult); // 输出: [1, 3, 7, 11, 13, 16, 33]
修复说明
- 预处理原数组:先去重并排序,同时转成Set,大幅提升元素存在性判断的效率。
- 邻近值逻辑优化:遍历去重后的数组,直接判断当前元素的前后相邻数是否存在,符合规则则加入结果。
- 新增中间值逻辑:遍历排序后的数组,检查相邻元素的差值,若为2则将中间数加入结果。
- 最后去重排序:确保结果无重复且按升序排列。
内容的提问来源于stack exchange,提问作者Perfect Roulette Deal
相关产品推荐
相关产品推荐

