猿问

如何在排序的数字列表中合并连续数字?

我想在可读字符串中连接一系列数字。应该像这样合并连续的数字'1-4'。


我能够将一个包含所有数字的数组连接成一个完整的字符串但是我在组合/合并连续数字时遇到了麻烦。


我尝试将前一个和下一个值与循环中的当前值进行比较,具有几个条件,if但我似乎无法找到正确的值以使其正常工作。


例子:


if(ar[i-1] === ar[i]-1){}

if(ar[i+1] === ar[i]+1){}

我的代码看起来像这样:


var ar = [1,2,3,4,7,8,9,13,16,17];


var pages = ar[0];

var lastValue = ar[0];


for(i=1; i < ar.length; i++){

      if(ar[i]-1 === lastValue){

          pages = pages + ' - ' + ar[i];

      }else{

          pages = pages + ', ' + ar[i];

      }

}


alert(pages);

结果是: 1 - 2, 3, 4, 7, 8, 9, 13, 16, 17


最后它应该是这样的:1-4, 7-9, 13, 16-17。


编辑:我在@CMS'链接中使用了第一个答案作为我的脚本。看起来非常像@ corschdi的片段的简短版本:


var ar = [1,2,3,4,7,8,9,13,16,17];



var getRanges = function(array) {

  var ranges = [], rstart, rend;

  for (var i = 0; i < array.length; i++) {

    rstart = array[i];

    rend = rstart;

    while (array[i + 1] - array[i] == 1) {

      rend = array[i + 1]; // increment the index if the numbers sequential

      i++;

    }

    ranges.push(rstart == rend ? rstart+'' : rstart + '-' + rend);

  }

  return ranges;

}



alert(getRanges(ar));


叮当猫咪
浏览 684回答 2
2回答

九州编程

这应该工作:var array = [1, 2, 3, 4, 7, 8, 9, 13, 16, 17];var ranges = [];var index = 0;while (index < array.length) {&nbsp; &nbsp; var rangeStartIndex = index;&nbsp; &nbsp; while (array[index + 1] === array[index] + 1) {&nbsp; &nbsp; &nbsp; &nbsp; // continue until the range ends&nbsp; &nbsp; &nbsp; &nbsp; index++;&nbsp; &nbsp; }&nbsp; &nbsp; if (rangeStartIndex === index) {&nbsp; &nbsp; &nbsp; &nbsp; ranges.push(array[index]);&nbsp; &nbsp; } else {&nbsp; &nbsp; &nbsp; &nbsp; ranges.push(array[rangeStartIndex] + " - " + array[index]);&nbsp; &nbsp; }&nbsp; &nbsp; index++;}console.log(ranges.join(", "));
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答