我有一系列的数字。我想打印所有的值,但如果可能的话,要有间隔。例如:
[1,2,3,5,7,8,10]我想你会明白我的榜样想要得到什么。对于上面的数组,我想得到以下字符串:
"1-3,5,7-8,10“
因此,我们在数组中有1,2,3,然后5。4不存在,所以我们关闭第一个间隔,并添加到字符串1-3。然后继续,在5到7之后。在这种情况下,我们不能创建间隔,因此我们只是添加5。然后继续,我们有7,7后8,8后10,所以我们只能创建7-8间隔。10是最后一个,所以我们把它加到字符串中。因此,我们有:
"1-3,5,7-8,10“。
我用以下方法解决了这一任务:
let numbers = [1,2,3,4,7,9,12,13];
numbers.sort((a,b) => {return a - b});
let str='';
let startIndex =0, start, end;
if(numbers.length === 1) {
str = `${numbers[0]}`;
}
for(let i=0; i< numbers.length; i++) {
if(i === 0) {
continue;
}
if(numbers[i-1] +1 !== numbers[i]) {
start = numbers[startIndex];
end = numbers[i -1];
if(start - end === 0) {
str += `${start},`;
}
else {
str += `${start} - ${end},`;
}
startIndex = i;
}
if(i+1 === numbers.length) {
start = numbers[startIndex];
end = numbers[i];
if(start - end === 0) {
str += `${numbers[i]}`;
} else {
str += `${numbers[startIndex]} - ${numbers[i]}`;
}
}
}
console.log(str);但是,代码看起来非常复杂,难以理解。有更好的方法吗?
发布于 2016-12-21 09:13:28
您可以用它们的前身测试这些项目,并将其移到正确的组中。
var data = [1, 2, 3, 5, 7, 8, 10],
result = data.reduce(function (r, a, i, aa) {
if (aa[i - 1] === a - 1) {
r[r.length - 1][1] = a;
} else {
r.push([a]);
}
return r;
}, []).map(a => a.join('-')).join(', ');
console.log(result);
发布于 2016-12-21 09:16:33
下面是一个函数,它将一个(排序的)数组转换为一个对(范围)数组。
let rangify = function(xs) {
let ranges = [];
for (let x of xs) {
let last = ranges[ranges.length - 1];
if (!last || x > last[1] + 1)
ranges.push([x, x])
else
last[1]++;
}
return ranges;
};
let r = rangify([1,2,3,5,7,8,10,11,12,13,77,78]);
console.log(r)
很明显,如何从中获得所需的输出是显而易见的。
https://stackoverflow.com/questions/41258755
复制相似问题