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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 04:09:04