js如何判断一组数字是否连续

js如何判断一组数字是否连续,得到一个临时数组[[3,4],[13,14,15],[17],[20],[22]];

var arr=[3, 4, 13 ,14, 15, 17, 20, 22];
阅读 19.7k
9 个回答
function arrange(source) {
    var t;
    var ta;
    var r = [];

    source.forEach(function(v) {
        console.log(t, v);   // 跟踪调试用
        if (t === v) {
            ta.push(t);
            t++;
            return;
        }

        ta = [v];
        t = v + 1;
        r.push(ta);
    });

    return r;
}

var arr = [3, 4, 13, 14, 15, 17, 20, 22];
console.log(arrange(arr));
C:\Users\James\Desktop>iojs test.js
undefined 3
4 4
5 13
14 14
15 15
16 17
18 20
21 22
[ [ 3, 4 ], [ 13, 14, 15 ], [ 17 ], [ 20 ], [ 22 ] ]

2021-07-15 补充一个 Lodash 分组实现的
import _ from "lodash";

export function arrange(source) {
    let last = 0;
    let groupId = 0;
    return _(source)
        // 如果是紧接着上一个数的,返回当前 groupId
        // 否则更新 groupId 并返回
        // 同时不能忘了更新 last
        // 数组是为了用表达式代替语句
        .groupBy(n => [last + 1 === n ? groupId : ++groupId, last = n][0])
        .values()
        .value();
}

連續是什麼意思

1,2,3 連續嗎?(連續自然數)

2,4,6,8 連續嗎?(連續偶數)

1,2,4,8,16,32,64 連續嗎?(連續等比數列)

1,2,3,5,6 連續嗎?(連續遞增數列)

1,2,4,8,9,10,11 連續嗎?(連續遞增數列)

1,0,-1,-2 連續嗎?(連續遞減數列)

1,0,1,0,1,0 連續嗎?(連續震蕩數列)

首先請定義何爲「連續」

然後就不是問題了。

var arr=[3, 4, 13 ,14, 15, 17, 20, 22];



globalRetArr=[];
function t(dataArr)
{
  if (dataArr.length==0)return;
  var tmp = dataArr[0];
  var tmpArr = [tmp];
  var d;
  for(var i=1;i<dataArr.length;++i)
  {
    d = dataArr[i];
    if (tmp*1+1==d*1){tmp=d;}else{break;}
  }
  globalRetArr.push(dataArr.slice(0,i));
  if(i != arr.length){
    t(dataArr.slice(i));
  }
}

t(arr);
console.log(globalRetArr);

请自行测试

结果

clipboard.png

    var arry=[-5,-4,0,1,2,3,4,13,14,15,17,20,22,99];
    function test(arr){
        var temp = [];
        temp.push(arr[0]);
        for(var i=1;i<arr.length;i++){
            if(arr[i]-1===arr[i-1]){
                temp.push(arr[i]);
            }else{
                arr = arr.splice(i);
                break;
            }
        }
        console.log(temp);
        temp = [];
        if(arr.length!==1){//这里说明下,因为for循环是从下标为1开始,所以这里处理当数组只有一项的时候
//不必继续执行test了。不处理就死循环了,别问我怎么知道的。。。
            !!arr.length && test(arr);  
        }

    };
    test(arry);

你跑一下,看是否是你想要的效果吧

var arrange = function(arr){

    var result = [],
        temp = [];

    arr.sort(function(source, dest){
        return source - dest;
    }).concat(Infinity).reduce(function(source, dest){

        temp.push(source);

        if(dest-source>1){
            result.push(temp);
            temp = [];
        }

        return dest;
    });

    return result;

};

var arr=[3, 4, 13 ,14, 15, 17, 20, 22];
console.log(arrange(arr));
function sortArray(arr) {
    if (!arr.length) {
        return arr;
    }
    else {
        var array = [];
        var temp = [arr[0]];
        for (var i = 1, l = arr.length; i < l; i++) {
            if (arr[i] === arr[i - 1] + 1) {
                temp.push(arr[i]);
            }
            else {
                array.push(temp);
                temp = [arr[i]];
            }
        }
        array.push(temp);
        return array;
    }
}

基本思想是
1.如果数组的后一项,比前一项大一,则是放到temp数组中
2.否则,新建一个数组,且第一项为当前项

let test = arr => {
    let contain = [arr[0]],
        res = [];
    for(var i = 1,iL = arr.length;i < iL;i++){
        if(arr[i] - arr[i-1] === 1){
            contain.push(arr[i])
            continue;
        }
        res.push(contain)
        contain = [arr[i]]
    }
    res.push(contain)
    return res;
}

/**
 * 是否是 连续增加或减少4个字以上的数字,如1234,4321;
 *
 * @param {String} num 字符串形式的number
 * @returns {Boolean}
 */
export const increaseNumber = (num) => {
    let boo = num.length >= 4;
    let bas = 0;
    const met = num[1] > num[0]; // true is '+', else is '-'

    num.split('').forEach((n, i) => {
        // eslint-disable-next-line no-redeclare
        var n = Number(n);
        if (i === 0) { bas = n; }
        if (n !== (met ? bas + i : bas - i)) {
            boo = false;
        }
    });

    return boo;
};

/**
 * 是否是 连续增加或减少4个字以上的英文字母,如 abcd, dcba;
 *
 * @param {String} str 字符串形式的number或者单词
 * @returns {Boolean}
 */
export const increaseNW = (str) => {
    const lowercase = 'abcdefghijklmnopqrstuvxyz';
    const r_low = lowercase.split('').reverse().join('');
    const capitalization = 'ABCDEFGHIJKLMNOPQRSTUVXYZ';
    const r_can = capitalization.split('').reverse().join('');
    let boo = false;
    if (str.length >= 4) {
        boo = lowercase.includes(str) || r_low.includes(str) || capitalization.includes(str) || r_can.includes(str);
    }
    return boo;
};

突然发现一个不错的:

https://blog.csdn.net/skyblac...

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏