多维数组连续值范围提取函数异常问题求助
修复多维数组连续值范围提取的错误
我写了一个函数用来提取多维数组中连续值的范围:当同一分组(数组第一个元素相同)内的第二个元素连续时,合并为组号,起始-结束的格式;序列中断时则保留单个元素的组号,值格式。
测试简单数组时输出符合预期:
- 测试数组:
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)。
修复方案
正确的处理逻辑应该是:
- 先按数组第一个元素分组,把同一组的第二个元素集中处理;
- 对每组内的第二个元素排序(确保序列有序,避免因输入无序导致判断错误);
- 遍历每组元素,跟踪当前连续范围的起始和结束值,遇到中断就把当前范围存入结果,再重置起始/结束值;
- 遍历结束后,把最后一个范围存入结果;
- 按规则格式化每个范围的输出字符串。
修复后的代码:
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
相关产品推荐
相关产品推荐

