数组,连续数据分段

有数组如 [1,2,3,5,6,7,9,10...]; 长度在8000-10000,需求是将数组中连续的分段。
形成如下结构:[[1,2,3],[5,6,7],[9,10...]]
求一个比较快的方法。

阅读 3.9k
6 个回答
function testSplit(array) {
    const result = [];
    for (let i = 0; i < array.length; i++) {
        if (i % 3) {
            result[result.length - 1].push(array[i]);
        } else {
            result.push([array[i]]);
        }
    }
    return result;
}
function splitGroups(arr){
        let o=[];
        let start=0;
        let index=0;
        for(let i=0;i<arr.length;i++){
            if(arr[i+1]-arr[i]!=1){
                o[index]=arr.slice(start,i+1);
                index++;
                start=i+1;
            }
        }
        return o
    }
[1,2,3,5,6,7,9,10].reduce((acc,cur,idx,arr)=>(cur % 3 || acc.push(arr.slice(idx-2,idx+1)),acc),[])

结果

0: (3) [1, 2, 3]
1: (3) [3, 5, 6]
2: (3) [6, 7, 9]
arr = [1,2,3,5,6,7,9,10]
arr.reduce((s,n)=>{
    if(s.length == 0){
        s.push([n])
    }else if(n - s[s.length - 1][s[s.length - 1].length - 1] == 1){
        s[s.length - 1].push(n)
    }else{
        s.push([n])
    }
    return s
},[])

这应该也没啥简单办法了吧。就是遍历一把,然后截取。em...突然想到可以随机步长(类似于滑动窗口那样),我试一下哈
image.png

都i++了 为什么不i+=3?

提供另一种思路:
用正则的速度会稍微快点,边界不满足三个的需单独处理

const arr = Array.from({ length: 9999 }, (_, index) => index);

function testSplit(array) {
  const result = [];
  for (let i = 0; i < array.length; i++) {
    if (i % 3) {
      result[result.length - 1].push(array[i]);
    } else {
      result.push([array[i]]);
    }
  }
  return result;
}

console.time("testSplit");
console.log(testSplit(arr));
console.timeEnd("testSplit");

function regSplit(arr) {
  return arr.join(",").match(/(\d+,){3}/g).map(item => item.split(",").slice(0,3).map(Number));
}



console.time("regSplit");
console.log(regSplit(arr));
console.timeEnd("regSplit");

image.png

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