有数组如 [1,2,3,5,6,7,9,10...]; 长度在8000-10000,需求是将数组中连续的分段。
形成如下结构:[[1,2,3],[5,6,7],[9,10...]]
求一个比较快的方法。
有数组如 [1,2,3,5,6,7,9,10...]; 长度在8000-10000,需求是将数组中连续的分段。
形成如下结构:[[1,2,3],[5,6,7],[9,10...]]
求一个比较快的方法。
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...突然想到可以随机步长(类似于滑动窗口那样),我试一下哈
提供另一种思路:
用正则的速度会稍微快点,边界不满足三个的需单独处理
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");
10 回答11.1k 阅读
6 回答3k 阅读
5 回答4.8k 阅读✓ 已解决
4 回答3.1k 阅读✓ 已解决
2 回答2.7k 阅读✓ 已解决
3 回答5.1k 阅读✓ 已解决
3 回答1.9k 阅读✓ 已解决