let arr = [1,2,3,4,5,6,6,7,8,9,10,10,10,11,12,12,4,5]
如何通过js 把它切成 [1,2,3,4,5,6] [6,6] [6,7,8,9,10] [10,10,10] [10,11,12] [12,12] [12,4,5]
规则: 1、相邻不同的合为一组; 2、相邻相同的合为一组。
let arr = [1,2,3,4,5,6,6,7,8,9,10,10,10,11,12,12,4,5]
如何通过js 把它切成 [1,2,3,4,5,6] [6,6] [6,7,8,9,10] [10,10,10] [10,11,12] [12,12] [12,4,5]
规则: 1、相邻不同的合为一组; 2、相邻相同的合为一组。
function merge(arr) {
let _arr = []; // 临时存储
let result = [];
if (arr.length===0) {
return [];
} else if (arr.length===1) {
return [arr];
}
_arr = [arr[0]];
// 从第1个开始循环
for(let i=1, len=arr.length; i<len; i++) {
// 若当前的数与前一个不相等
if (arr[i]!==arr[i-1]) {
_arr.push(arr[i]);
// 若当前的数与后一个相等时,则说明当前的队列完成
if (arr[i]===arr[i+1]) {
result.push(_arr);
_arr =[arr[i]];
}
} else {
_arr.push(arr[i]);
if (arr[i]!==arr[i+1]) {
result.push(_arr);
_arr = [arr[i]];
}
}
if (i===len-1) {
result.push(_arr);
}
}
return result;
}
测试样例:
var arr = [1,2,3,4,5,6,6,7,8,9,10,10,10,11,12,12,4,5];
console.log( merge(arr) );
/*
[
[1, 2, 3, 4, 5, 6]
[6, 6]
[6, 7, 8, 9, 10]
[10, 10, 10]
[10, 11, 12]
[12, 12]
[12, 4, 5]
]
*/
var arr = [];
console.log( merge(arr) ); // []
var arr = [1];
console.log( merge(arr) );
/*
[
[1]
]
*/
var arr = [1, 2];
console.log( merge(arr) );
/*
[
[1, 2]
]
*/
var arr = [1, 2, 3];
console.log( merge(arr) );
/*
[
[1, 2, 3]
]
*/
var arr = [1, 1, 2, 2, 3];
console.log( merge(arr) );
/*
[
[1, 1]
[1, 2]
[2, 2]
[2, 3]
]
*/
let arr = [1, 2, 3, 4, 5, 6, 6, 7, 8, 9, 10, 10, 10, 11, 12, 12, 4, 5]
//结果二维数组
let result = [[]]
//结果二维数组最后的索引
let resultLastIndex = 0
//当前 不同 0 / 相同 1 标示
let currentFlag = 0
arr.forEach((item, index) => {
let r = result[resultLastIndex]
let compare = r[r.length - 1]
if (item !== compare) {
if (currentFlag === 0) {
r.push(item)
} else {
currentFlag = 0
result.push([arr[index - 1], item])
resultLastIndex++
}
} else {
if (currentFlag === 0) {
currentFlag = 1
result.push([arr[index - 1], item])
resultLastIndex++
} else {
r.push(item)
}
}
})
console.log(result)
// 测试用例
var arr = [[1, 2, 3, 4, 5, 6, 6, 7, 8, 9, 10, 10, 10, 11, 12, 12, 4, 5], [1, 2], [1, 2, 3], [], [1,1,1,1,1,1]]
function splitFunc(arr) {
let arr2 = [[]];
for (let i = 0, len = arr.length; i < len; i++) {
let currentVal = arr[i];
let last = arr2[arr2.length - 1];
if (i > 0 && currentVal === last[last.length - 1]) {
let count = 2;
while (i < len && arr[++i] === currentVal) {
count++;
}
let newArr = [];
for (let j = 0; j < count; j++) {
newArr.push(currentVal);
}
arr2.push(newArr);
arr2.push([]);
i -= 2;
} else {
last.push(currentVal);
}
}
return arr2;
}
// 输出结果
arr.forEach((item) => {
console.log(splitFunc(item))
})
let arr = [1, 2, 3, 4, 5, 6, 6, 7, 8, 9, 10, 10, 10, 11, 12, 12, 4, 5]
const splitArray = arr => arr.length <= 1 ? [] : (() => {
const newarr = [arr.shift(), arr.shift()]
while (arr.length > 0 && (arr[0] === newarr[newarr.length - 1]) === (newarr[0] === newarr[1])) {
newarr.push(arr.shift())
}
return [newarr, ...splitArray([newarr[newarr.length - 1], ...arr])]
})()
console.log(splitArray(arr))
疑问,如果是[1,2,1,1,1,3,4]要怎么分?是[[1,2,1],[1,1,1],[1,3,4]]还是其他的?
function A2N( inArr ){ // 没有处理传入不是数组的情况,其他情况基本都处理啦。
let len=inArr.length;
if(len==0) return [];
if(len==1) return [ [inArr[0] ];
if(len==2) return [ [ inArr[0], inArr[1] ];
let out=[],
old0= inArr[0],
old1= inArr[1];
let tmp=[ old0, old1 ];
for(let i=2;i<len;i++){
let n=inArr[i];
if(n == old1){
if( n == old0){
tmp.push(n);
}else{
out.push( tmp );
tmp=[ n, n ];
old0=n;
}
}else{
if(old0 == old1){
out.push(tmp);
tmp = [ old1,n ];
old1=n;
}else{
tmp.push(n);
old0=old1;
old1=n;
}
}
}
out.push(tmp);
return out;
}
10 回答11.6k 阅读
2 回答3.1k 阅读✓ 已解决
3 回答2.7k 阅读✓ 已解决
4 回答2.2k 阅读✓ 已解决
3 回答1.2k 阅读✓ 已解决
3 回答1.9k 阅读✓ 已解决
3 回答806 阅读✓ 已解决