1.数字相邻,重新生成一个新的数组,相邻的数字差值大于2的情况下取最小和最大的数字
注意:请先将数组按升序排序
var array = [1,2,5,8,9,10,14,15,17,19,20,21,22,23,25];
function sort(arr){
return repeat(function(num,newArr){
if(newArr[0].length == 1 && newArr[0][0]-num == 1){
return [
[num,newArr[0][0]]
].concat(newArr.slice(1))
}else if(newArr[0].length == 2 && newArr[0][0]-num == 1){
return [
[num,newArr[0][1]]
].concat(newArr.slice(1))
}else{
return [
[num]
].concat(newArr)
}
},arr,[])
}
function repeat(func,arr,final){
if (arr.length == 0){
return final
}else{
return func(aar[0],repeat(func,arr.slice(1),final))
}
}
sort(array) // [[1,2],[5],[8,10],[14,15],[17],[19,23],[25]]
本人也是一个新手,看一眼的时候也是一脸懵逼,这什么意思?逻辑都把自己给绕晕了,所以只能自己一点一点的往里面套数据,这才弄懂逻辑,
concat是数组合并,
slice是数组截取,一个参数返回的是从参数下标开始后面元素
通过函数repeat循环数据,
如:[1,2,4,5,7]
repeat中的函数func的两个参数num和newArr
num | newArr |
---|---|
1 | [[2],[4,5],[7]] |
2 | [[4,5],[7]] |
4 | [[5],[7]] |
5 | [[7]] |
7 | [] |
最终得到的是[[1,2],[4,5],[7]]
如有更好的方法请多多评论交流