js如何处理数字字符串是连续或单独显示

有如下数字字符串:

174,176,177,178,179,180,183,189,190,

期待结果:

174,176~180,183,189~190

想不出怎么处理,有什么思路或者代码示例,谢谢!!

阅读 4.1k
6 个回答

昨天有童鞋指出输出结果不对,一看逻辑确实是有点问题
原答案已修改,代码更简洁,逻辑更清晰,并已注释:

var arr = [174, 176, 177, 178, 179, 180, 183, 189, 190]

function group(list) {
  list = list.sort()
  var tmp = []
  list.forEach((item, index) => {
    var prev = list[index - 1] //前一项
    if (prev && item === prev + 1) {//有相邻前一项
      if (typeof tmp[tmp.length - 1] === 'number') {//输出数组最后一项是数字
        tmp[tmp.length - 1] = prev + '~' + item //拼接成字符串
      } else {//输出数组最后一项是字符串
        tmp[tmp.length - 1] = tmp[tmp.length - 1].split('~')[0] + '~' + item // 替换字符串最后的数字
      }
    } else {//没有前一相邻项或者没有前一项
      tmp.push(item)
    }
  })
  return tmp
}

console.log(group(arr))
var str="174,176,177,178,179,133,134,125,126,127,128,130,129,180,183,189,190";
var arr=str.split(",").map(val=>Number(val)).sort((val1,val2)=>val1-val2);
var last=arr[0];
var n=1;
var res=arr.reduce((prev,val,index)=>{
    var _last=last;
    last=val;
    if(index===arr.length-1){
        if(val==(_last+1))return prev+"~"+val;
        return prev+","+val;
    }
    else if(val==(_last+1)){
        n++;
        return prev;
    }
    else if(n===1){
        n=1;
        return prev+","+val;
    }else{
        n=1;
        return prev+"~"+_last+","+val;
    }
});
console.log(res)
 var arr = [174, 176, 177, 178, 179, 180, 183, 189, 190];
    var r = arr.slice(0);
    var nr = [],
      wr = [];
    for (var i = 1; i < r.length; i++) {
      nr.push(r[i] - r[i - 1]);
    }
    console.log(nr)
    var k = 0;
    for (var j = 0; j < nr.length; j++) {
      if (nr[j] != 1 && nr[j + 1] == 1) {
        wr.push(arr[j] + '');
      }
      if (nr[j] == 1) {
        k++;
        if (nr[j + 1] != 1) {
          wr.push(arr[j-k+1] + '~' + (arr[j+1]));
          k = 0;
        }
      }
    }
    console.log(wr);

写代码之前先想想这个需求是哪来的,为什么要这么做!数据是谁给你的,给你这样的数据,却要前端来处理成想要的格式?每次的数据都不一样,换一次数据你就得重新写一次字符串拼接。累死人,开玩笑呢。这种应该服务端处理的问题,不要往身上揽。

<script type="text/javascript">
            var str = "174,176,177,178,179,180,183,189,190";
            var strArray = str.split(",");
            var temp = "";
            var result = "";
            for (var i = 0; i < strArray.length; i++) {
                var topTow = strArray[i].substring(0, 2);
                if (temp == topTow) {
                    //result+=topTow+",";
                } else if (temp != "") {
                    result += temp + "~" + topTow + ",";
                    temp = topTow;
                } else {
                    temp = topTow;
                }
            }
            alert(result);
        </script>

目前想到的办法是[174, 176, 177, 178, 179, 180, 183, 189, 190] -> [174, [176, 177, 178, 179, 180], 183, [189, 190]];,然后[176, 177, 178, 179, 180] -> [176_180]

推荐问题