Welcome toVigges Developer Community-Open, Learning,Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
360 views
in Technique[技术] by (71.8m points)

如何将数组[1,2,3,5,6,7]改为字符串"1-3点,5-7点"形式?

问题描述

 上面提出一个需求,希望将用户选择的时间,例如1点,2点,3点,5点,6点,7点,8点显示为1-3点,5-8点这种形式

### 相关代码 粘贴代码文本(请勿用截图)
后台返回时间是数组形式的,内容为number形式

res = [1,2,3,4,7,8,9,11,12] 数组里就是用户选择的时间点
期望在页面上显示为字符串类型: 1-4点,7-9点,11-12点这种形式
在下才疏学浅,不知道怎么实现,有没有大神帮帮忙

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)
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"]

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to Vigges Developer Community for programmer and developer-Open, Learning and Share
...