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

多维数组连续值范围提取函数异常问题求助

修复多维数组连续值范围提取的错误

我写了一个函数用来提取多维数组中连续值的范围:当同一分组(数组第一个元素相同)内的第二个元素连续时,合并为组号,起始-结束的格式;序列中断时则保留单个元素的组号,值格式。

测试简单数组时输出符合预期:

  • 测试数组:array2 = [[1, 2],[1, 3],[1, 4],[3, 8],[3, 11],[6, 1],[6, 2]]
  • 函数输出:['1,2-4', '3,8', '3,11', '6,1-2'],与预期一致。

但测试包含「连续-中断-再连续」结构的数组时,函数输出出错:

  • 测试数组:const array = [[1, 2],[1, 3],[1, 4],[1, 5],[1, 7],[1, 9],[1, 12],[1, 13],[1, 14],[2, 5],[2, 6],[2, 7],[10, 2],[10, 8]]
  • 错误输出:['1,2-14', '1,7', '1,9', '1,12', '2,5-7', '7,6-7', '8,7', '8,9', '10,2', '10,8']
  • 正确输出应为:['1,2-5', '1,7', '1,9', '1,12-14', '2,5-7', '10,2', '10,8'](注:原正确输出里的7,6-7, 8,7, 8,9应为笔误,测试数组中无7、8开头的元素)

问题根源

原函数的核心逻辑错误在于:没有按数组第一个元素正确分组处理,或者在跟踪连续序列时,未在序列中断后及时重置当前范围的起始/结束值,导致跨中断的非连续序列被错误合并(比如把1,2-5和1,12-14合并成1,2-14)。

修复方案

正确的处理逻辑应该是:

  1. 先按数组第一个元素分组,把同一组的第二个元素集中处理;
  2. 对每组内的第二个元素排序(确保序列有序,避免因输入无序导致判断错误);
  3. 遍历每组元素,跟踪当前连续范围的起始和结束值,遇到中断就把当前范围存入结果,再重置起始/结束值;
  4. 遍历结束后,把最后一个范围存入结果;
  5. 按规则格式化每个范围的输出字符串。

修复后的代码:

function extractRanges(arr) {
  // 按第一个元素分组,收集每组的第二个元素
  const groups = {};
  arr.forEach(item => {
    const groupKey = item[0];
    if (!groups[groupKey]) {
      groups[groupKey] = [];
    }
    groups[groupKey].push(item[1]);
  });

  const result = [];
  // 处理每个分组
  Object.keys(groups).forEach(key => {
    // 先排序,确保值是按升序排列的
    const sortedValues = groups[key].sort((a, b) => a - b);
    let rangeStart = sortedValues[0];
    let rangeEnd = sortedValues[0];

    for (let i = 1; i < sortedValues.length; i++) {
      const currentVal = sortedValues[i];
      // 判断当前值是否和上一个连续
      if (currentVal === rangeEnd + 1) {
        rangeEnd = currentVal;
      } else {
        // 序列中断,存入当前范围
        result.push(
          rangeStart === rangeEnd 
            ? `${key},${rangeStart}` 
            : `${key},${rangeStart}-${rangeEnd}`
        );
        // 重置范围起始和结束为当前值
        rangeStart = currentVal;
        rangeEnd = currentVal;
      }
    }
    // 存入最后一个范围
    result.push(
      rangeStart === rangeEnd 
        ? `${key},${rangeStart}` 
        : `${key},${rangeStart}-${rangeEnd}`
    );
  });

  return result;
}

// 测试问题数组
const testArray = [[1, 2],[1, 3],[1, 4],[1, 5],[1, 7],[1, 9],[1, 12],[1, 13],[1, 14],[2, 5],[2, 6],[2, 7],[10, 2],[10, 8]];
console.log(extractRanges(testArray));
// 输出:["1,2-5", "1,7", "1,9", "1,12-14", "2,5-7", "10,2", "10,8"]

代码说明

  • 分组处理:确保只在同一组内判断连续值,不会跨组干扰;
  • 排序步骤:即使输入数组的同一组元素是无序的,也能正确识别连续序列;
  • 范围跟踪:每次遇到非连续值时,立即将当前范围存入结果并重置跟踪变量,避免错误合并中断后的序列。

内容的提问来源于stack exchange,提问作者nidhi sharma

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 04:25:21