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

标签 javascript arrays numbers concatenation

<分区>

我想将一系列数字连接成一个可读的字符串。连续的数字应该像这样合并 '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));

最佳答案

在您的代码中,lastValue 在循环中永远不会改变,因此您永远都在与数组中的第一个元素进行比较。此外,当您确实找到匹配项时,您还没有准备好追加到 pages 结果——可能会有更多的数字。

一种方法可能是保留当前数字序列的运行(或仅运行中的第一个和最后一个数字),并且仅在我们发现序列中断或点击字符串的结尾。

有很多方法可以解决这个问题,我建议在 Codewars: Range Extraction 查看其他人的答案。 kata,它(几乎)与这个问题相同。

这是我的解决方案:

const rangeify = a => {
  const res = [];
  let run = []
  
  for (let i = 0; i < a.length; i++) {
    run.push(a[i]);

    if (i + 1 >= a.length || a[i+1] - a[i] > 1) {
      res.push(
        run.length > 1 ? `${run[0]}-${run.pop()}` : run
      );
      run = [];
    }
  }
  
  return res.join(", ");
};

[
  [1,2,3,4,7,8,9,13,16,17],
  [],
  [1],
  [1, 2],
  [1, 3],
  [1, 2, 3, 8],
  [1, 3, 4, 8],
  [1, 1, 1, 1, 2, 3, 4, 5, 5, 16],
  [-9, -8, -7, -3, -1, 0, 1, 2, 42]
].forEach(test => console.log(rangeify(test)));

关于javascript - 如何合并排序的数字列表中的连续数字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56173207/

相关文章:

javascript - 数据表作为全功能的表单元素

javascript - 当在 Chrome 和 Firefox 中声明 DOCTYPE 时,Google Map API 不起作用

c - 我如何在单行上打印数字

javascript - 有没有一种方法可以让我打印一个没有逗号的数组?

c++ - 此正则表达式无法解析所有有效的 float

Python 任意数字转非科学字符串

javascript - 已绘制 Phaser 按钮但未触发单击事件

javascript - 如何将 javascript 和 html 拆分为多个文件

c - 初始化指向 char 的指针数组

python - 在 Python 中构建随机集群的更 Pythonic 方式