-
Notifications
You must be signed in to change notification settings - Fork 46
Open
Description
多维数组的展开可以有很多种写法。下面总结一下
写法1
function flatten1(arr){
var result=[];
for(var i=0;i<arr.length;i++){
if(Array.isArray(arr[i])){
result.push(...flatten1(arr[i]));
}else{
result.push(arr[i])
}
}
return result;
}
// 测试用例
var test1 = [1,2,[3,4,[5,6,[7,8],9],10]];
console.log(flatten1(test1))
function flatten(arr){
let result = []
if(Array.isArray(arr)){
arr.map(item=>{
result = result.concat(flatten(item))
})
}else{
result.push(arr);
}
return result;
}
var test1 = [1,2,[3,4,[5,6,[7,8],9],10]];
console.log(flatten(test1))
写法2
function flatten2(arr){
return [].concat(...arr.map(a=> Array.isArray(a)? flatten2(a):a))
}
// 测试用例
var test2 = [1,2,[3,4,[5,6,[7,8],9],10]];
console.log(flatten2(test2));
写法3
function flatten3(arr){
return arr.reduce(function(total,currentValue){
return total.concat(Array.isArray(currentValue) ? flatten3(currentValue) : currentValue);
},[])
}
// 测试用例
var test3 = [1,2,[3,4,[5,6,[7,8],9],10]];
console.log(flatten3(test3));
如果能自定义展开的深度呢?
function flatten4(arr,deep=1){
let result = [];
arr.forEach(a => {
let d = deep
if(Array.isArray(a) && d>0){
result.push(...(flatten4(a,--d)))
}else{
result.push(a)
}
})
return result;
}
// 测试用例
var test4 = [1,2,[2,2],[3,4,[3,3],[5,6,[7,8],9],10]];
console.log(flatten4(test4));
在线演示地址:https://codepen.io/zhaojianxin/pen/RJJGrB?editors=0012