鍍金池/ 問答/HTML/ js如何處理數(shù)字字符串是連續(xù)或單獨(dú)顯示

js如何處理數(shù)字字符串是連續(xù)或單獨(dú)顯示

有如下數(shù)字字符串:

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

期待結(jié)果:

174,176~180,183,189~190

想不出怎么處理,有什么思路或者代碼示例,謝謝!!

回答
編輯回答
紓惘

寫代碼之前先想想這個(gè)需求是哪來的,為什么要這么做!數(shù)據(jù)是誰給你的,給你這樣的數(shù)據(jù),卻要前端來處理成想要的格式?每次的數(shù)據(jù)都不一樣,換一次數(shù)據(jù)你就得重新寫一次字符串拼接。累死人,開玩笑呢。這種應(yīng)該服務(wù)端處理的問題,不要往身上攬。

2017年1月19日 18:43
編輯回答
絯孑氣

昨天有童鞋指出輸出結(jié)果不對(duì),一看邏輯確實(shí)是有點(diǎn)問題
原答案已修改,代碼更簡潔,邏輯更清晰,并已注釋:

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] //前一項(xiàng)
    if (prev && item === prev + 1) {//有相鄰前一項(xiàng)
      if (typeof tmp[tmp.length - 1] === 'number') {//輸出數(shù)組最后一項(xiàng)是數(shù)字
        tmp[tmp.length - 1] = prev + '~' + item //拼接成字符串
      } else {//輸出數(shù)組最后一項(xiàng)是字符串
        tmp[tmp.length - 1] = tmp[tmp.length - 1].split('~')[0] + '~' + item // 替換字符串最后的數(shù)字
      }
    } else {//沒有前一相鄰項(xiàng)或者沒有前一項(xiàng)
      tmp.push(item)
    }
  })
  return tmp
}

console.log(group(arr))
2018年8月6日 03:02
編輯回答
臭榴蓮

目前想到的辦法是[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]

2017年10月22日 08:07
編輯回答
枕頭人
 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);
2018年9月2日 21:25
編輯回答
鐧簞噯
<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>
2018年5月8日 21:02
編輯回答
魚梓
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)
2017年12月15日 07:53