Javascript 将阵列中缺少的连续数字打印为范围

Javascript 将阵列中缺少的连续数字打印为范围,javascript,arrays,loops,Javascript,Arrays,Loops,我想以范围显示数组中未显示的数字,数组包含1到128的数字 例如,对于数组[87,89,90,91,92,93,94,95,96,97,99] 我想打印1-86,88,98,100-128 我写了一个函数,它只有在第一个未使用的数字中间和最后的中没有数字时才起作用。 函数打印端口(端口){ var portString=“”; var open=true; 设指数=1 对于(;索引

我想以范围显示数组中未显示的数字,数组包含1到128的数字

例如,对于数组[87,89,90,91,92,93,94,95,96,97,99]

我想打印1-86,88,98,100-128

我写了一个函数,它只有在第一个未使用的数字中间和最后的

中没有数字时才起作用。
函数打印端口(端口){
var portString=“”;
var open=true;
设指数=1
对于(;索引<129;索引++){
对于(设j=0;j控制台日志(打印端口([87,89,90,91,92,93,94,95,96,97,99])首先,使用
includes()
方法测试数组是否包含元素,从而简化代码

然后,使用嵌套循环执行此操作。外部循环查找范围的起点。当它找到它时,内部循环将查找范围的末尾。测试起始和结束是否相同,以决定是输出一个数字还是两个介于两者之间的数字

生成逗号分隔字符串的最佳方法是将结果放入数组中,然后在末尾使用
join()
将它们连接起来

函数打印端口(端口){
var openPorts=[];
对于(让索引=1;索引<129;索引++){
如果(!端口包括(索引)){
让startPort=索引;
对于(索引=startPort+1;索引<129;索引++){
if(端口包括(索引)){
打破
}
}
设endPort=index-1;
push(startPort==endPort?startPort:`${startPort}-${endPort}`);
}
}
返回openPorts.join(“,”);
}
log(打印端口([87,89,90,91,92,93,94,95,96,97,99]);
log(打印端口([1,2,87,89,90,91,92,93,94,95,96,97,99,120,128])
函数打印端口(端口){
让portString=“”;
让start=1;
让停止=128;
ports.sort((a,b)=>a-b)
用于(让我输入端口){
如果(开始==端口[i]-1){
portString+=开始+”,“
}
else if(启动<端口[i]-1){
portString+=start+“-”+字符串(端口[i]-1)+“,”;
}
开始=端口[i]+1;
}
如果(启动<停止){
端口字符串+=开始+“-”+字符串(停止);
}
else if(开始==停止){
portString+=停止;
}
其他的
portString=portString.substring(0,portString.length-1);
返回端口字符串;
}
控制台日志(打印端口([87,89,90,91,92,93,94,95,96,97,99]);
控制台日志(打印端口([1,3,87,89,90,91,92,93,94,95,96,97,99128]);

日志(打印端口([95,89,91,92,93,94,87,96,97,90,99])将0添加到数组的开头,将129添加到数组的结尾,迭代元素,如果相邻元素之间的差值为2,则打印其中的值,如果大于2,则打印范围。

如果数组未排序,首先对数组进行排序,然后在数组中循环一次,通过比较前一个值和当前值找到缺少的范围

下面的解决方案还包含缺少范围数组的注释行

你可以找到工作代码笔


与问题无关,但应使用
端口。包括(索引)
端口。indexOf(索引)!=-1
而不是编写自己的循环。
console.log(PrintPorts([87,89,90,91,92,93,94,95,96,97,99]))

function PrintPorts(ports) {
  const sorted = ports.sort(function (p1, p2) {return p1-p2} );
  const missingRanges = [];
  let missingRangesStr = ''
  let previous;
  sorted.forEach(function(p, index) {

    if(index == 0 && p > 1) {
      missingRangesStr += (1 + ' - ' + (p - 1)) + ', ';
      // missingRanges.push([1, p - 1]);
      previous = p;
      return;
    }
    if(index === (sorted.length - 1) && p !== 128) {
      // missingRanges.push([p + 1, 128]);
      missingRangesStr += (p  + 1 + ' - ' + 128) + ', ';
      previous = p;
      return;
    }

    if(previous && (previous + 1) !== p) {

      if((previous + 2) === p) {
        missingRangesStr += (previous + 1) + ', ';
        // missingRanges.push([previous + 1]);
      } else {
        missingRangesStr += (previous + 1) + '-' + (p - 1) + ', ' ;
        // missingRanges.push([previous + 1, p - 1]);
      }

    }
    previous = p;
  });
  return missingRangesStr.replace(/(,\s)$/, ''); 
}