javascript - 如何在排序的数字列表中合并连续的数字?
问题描述
我想在一个可读的字符串中连接一系列数字。连续的数字应该像这样合并'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)));
推荐阅读
- wordpress - 当我使用 WP Comment_query() 时,没有出现回复评论链接
- istio - Istioctl 运算符 init 在 Azure Devops 管道中不起作用
- r - 在 ggplot2 中,使用不同的行名绘制多个 geom_lines 以识别它们
- laravel - 不同后端项目之间的 Laravel 身份验证
- amazon-redshift - Redshit:将间隔转换为秒会产生错误的值
- flutter - 在多个字符串中颤动搜索
- php - 在错误的位置添加 JSON 数据
- mysql - MYSQL 中没有日期但按另一列分组的移动平均值
- asp.net-core - ASPNET Core 选项绑定不填充字典键/值对
- javascript - 使用 handlebars.js 创建条件渲染