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

非攻i
  • 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点这种形式
在下才疏学浅,不知道怎么实现,有没有大神帮帮忙
回复
阅读 520
3 个回答
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"]

给你个好理解, 直接粗暴的

 <script>
    const res = [1,2,3,4,7,8,9,11,12];
    const len = res.length;
    let i = 1, str=[], n=res[0] ;
    let arr = n + '';
    // 1: 形成一个数组["1,2,3,4", "7,8,9", "11,12"]
    while(i<len){
      if(res[i] === n+1){
       arr += ',' + res[i]
      }else{
        str.push(arr);
        arr = res[i]
      }
      if(i===len-1){
        str.push(arr + '');
      }
      n = res[i];
      i++;
    }
    // 2: 分割一下就ok了
    console.log(str)

    let endStr = '' 
    str.forEach((item)=>{
      const splititem = item.split(',');
      if(splititem.length > 1){
        endStr += `${splititem[0]}点-${splititem[splititem.length-1]}点; `
      }else{
        endStr += `${splititem[0]}点; `
      }
    })
    console.log(endStr)

  </script>

这个x点-y点,x和y之间的间隔有规律吗,关键就是这个间隔的规律,找出这个规律,对数组排序之后,按规律计算对应的数组的index就行,获取index对应的数组的值拼成x点-y点的形式就行。

你知道吗?

宣传栏