如何使用JavaScript/jQuery将数组连续相邻数字合并为区间展示
实现方案
首先默认你的输入数组为升序排列,如果数组可能无序,执行逻辑前先调用arr.sort((a, b) => a - b)排序即可。
方案1:Array.reduce()高阶函数实现
属于声明式写法,无需手动维护循环索引,代码简洁易读:
const numArr = [1, 2, 3, 4, 6, 7, 8, 10, 15, 16, 17]; const formatResult = numArr.reduce((acc, currentVal) => { // 初始无分组时新增第一个分组 if (acc.length === 0) { acc.push([currentVal]); return acc; } // 取最后一个分组的末尾数值做判断 const lastGroup = acc.at(-1); const lastGroupEnd = lastGroup.at(-1); currentVal === lastGroupEnd + 1 ? lastGroup.push(currentVal) : acc.push([currentVal]); return acc; }, []) // 把分组转成目标格式的字符串 .map(group => group.length === 1 ? String(group[0]) : `${group[0]} - ${group.at(-1)}`) .join(', '); console.log(formatResult); // 输出:1 - 4, 6 - 8, 10, 15 - 17
方案2:递归实现
不想用迭代逻辑时可以选择这种写法:
function mergeContinuousNum(arr) { if (arr.length === 0) return ''; // 找到当前第一个连续区间的结束索引 let intervalEndIndex = 0; while (intervalEndIndex + 1 < arr.length && arr[intervalEndIndex + 1] === arr[intervalEndIndex] + 1) { intervalEndIndex++; } // 拼接当前区间字符串 const currentInterval = intervalEndIndex === 0 ? String(arr[0]) : `${arr[0]} - ${arr[intervalEndIndex]}`; // 递归处理剩余未分组的元素 const restResult = mergeContinuousNum(arr.slice(intervalEndIndex + 1)); return restResult ? `${currentInterval}, ${restResult}` : currentInterval; } const numArr = [1, 2, 3, 4, 6, 7, 8, 10, 15, 16, 17]; console.log(mergeContinuousNum(numArr)); // 输出:1 - 4, 6 - 8, 10, 15 - 17
两种方案的时间复杂度都和普通遍历一致,为O(n),仅写法风格有区别,可根据你的开发习惯选择。
内容的提问来源于stack exchange,提问作者Kevin
相关产品推荐
相关产品推荐

