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

时间:2019-05-16 16:48:24

标签: 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));

2 个答案:

答案 0 :(得分:5)

在您的代码中,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)));

答案 1 :(得分:1)

这应该有效:

<div class="box-body">
    <table id="example1" class="table table-bordered table-striped">
    <thead>
    <tr>
        <th>ID</th>
        <th>Preis</th>
        <th>status</th>
        <th>Aktion</th>                  
    </tr>
    </thead>
    <tbody>
<?php while($waren = mysqli_fetch_array($ware)) {   

        echo "<tr>";
        echo "<td>" . $waren["id"] . "</td>";
        echo "<td>" . $waren['ean'] . "</td>";
        echo "<td>" . $waren['status'] . "</td>";
        echo '<td><form method="post"><button type="submit" name="del" value='. $waren["id"] .' class="btn btn-danger btn-xs">Löschen</button></a></form></td>';
        echo "</tr>";

} 
?>
    </tbody>
    <tfoot>
        <tr>
            <th>ID</th>
            <th>Preis</th>
            <th>status</th>
            <th>Aktion</th>                
        </tr>
    </tfoot>
    </table>
    </div>
</div>