一、递归
function flatten(arr){
let res = [];
for(let i=0; i<arr.length; i++){
if(Array.isArray(arr[i])){
res = res.concat(flatten(arr[i]));
} else {
res.push(arr[i]);
}
}
return res;
}
let arr = [1,[2,[3,4],5],[6,7]];
console.log(flatten(arr)); // [ 1, 2, 3, 4, 5, 6, 7 ]
Array.isArray():判断某个值是否为数组,返回布尔类型。
concat():不改变原数组,返回一个新数值。它的参数接受数组,也接受数值。
二、reduce
function flatten(arr){
return arr.reduce((res,item)=>{
return res.concat(Array.isArray(item) ? flatten(item) : item)
},[])
}
let arr = [1,[2,[3,4],5],[6,7]];
console.log(flatten(arr));
reduce():它接收一个函数作为累加器,数组中的每个值(从左到右)开始缩减,最终计算为一个值。
reduce包含两个参数:回调函数,传给total的初始值。
补充:用 reduce 求数组的和,不改变原数组,返回一个新的值。
let arr = [1,2]; console.log(arr.reduce((res,item)=>{ return res+item },0)); // 3 console.log(arr); // [1,2]
三、toString & split
function flatten(arr){
return arr.toString().split(",").map(item=>{
return Number(item);
// return parseInt(item);
})
}
let arr = [1,[2,[3,4],5],[6,7]];
console.log(flatten(arr));
toString 可以将数组转换为字符串。
因为 split 分割后形成的数组的每一项值为字符串,所以需要用一个 map 方法遍历数组将其每一项转换为数值型。
map():对数组中每一项运行回调函数,返回该函数的结果组成的新数组,不改变原数组。
四、join & split
function flatten(arr){
return arr.join(",").split(",").map(item=>{
return Number(item);
// return parseInt(item);
})
}
let arr = [1,[2,[3,4],5],[6,7]];
console.log(flatten(arr));
join 也可以将数组转换为字符串。
五、扩展运算符
function flatten(arr){
while(arr.some(item => Array.isArray(item))){
arr = [].concat(...arr);
}
return arr;
}
let arr = [1,[2,[3,4],5],[6,7]];
console.log(flatten(arr));
some():对数组中每一项运行回调函数,如果该函数对某一项返回 true,则 some 返回 true。
ES6 的扩展运算符能将二维数组变为一维。
参考:https://blog.csdn.net/i_dont_know_a/article/details/82707646
END