const foo = (res) => res.reduce((acc, cur, i, src) => {
// 与上一个元素不衔接
if (cur - 1 !== src[i - 1]) {
acc.push(String(cur));
// 与下一个元素不衔接
} else if (cur + 1 !== src[i + 1]) {
acc[acc.length - 1] += `-${cur}`;
}
return acc;
}, []);
// 测试
> foo([1, 2, 3, 4, 7, 8, 9, 11, 12])
<?(3) ["1-4", "7-9", "11-12"]
> foo([1, 2, 3, 4, 7, 8, 9, 11, 12, 15, 17, 19, 20, 21, 23])
< (7)?["1-4", "7-9", "11-12", "15", "17", "19-21", "23"]
如果还有 3.5 这种骚操作,可以把第一个 if
条件换成 !src[i - 1] || cur - 1 > src[i - 1]
,第二个换成 !src[i + 1] || cur + 1 < src[i + 1]
。记换过后的函数为 baz
。测试:
> baz([1, 2, 3, 4, 7, 8, 9, 11, 12])
< (3)?["1-4", "7-9", "11-12"]
> baz([1, 2, 3, 3.6, 7.1, 8.2, 9, 11.5, 12])
< (4)?["1-3.6", "7.1", "8.2-9", "11.5-12"]