把多维数组转换为一维数组的方法:
- 方法一:toString( )
//答案:
function flatten(arr) {
return arr.toString().split(',').map(function(item){
return +item;//类型准换为
})
}
//解析:
arr=[[1,2,3],[4,5,6],[7,8,9]]
console.log(arr.toString());
//输出 1,2,3,4,5,6,7,8,9
console.log(arr.toString().split(","));
//输出 (9) ['1', '2', '3', '4', '5', '6', '7', '8', '9']
- 方法二:展开运算符 arr.some
知识点:
arr.some(()=>{}) 用于逐一检查数组中是否有元素满足某个条件,有就返回 true,并且不再继续向下检查。没有就返回 false。
concat 用于连接多个数组。`arr = [1,2,3],res = arr.concat(arr,1)
function flatten(arr) {
//检查 arr 中是否有元素是数组:
while(arr.some((item)=>{Array.isArray(item)})){
arr = [].concat(...arr);//逐层拨开洋葱的心,直到没有数组
}
return arr;
}
//解析:
let arr = [1,2,3]
console.log(...arr);// 1 2 3
let arr2 = [[1,2,3],[4,5,6],[7,8,9]];
console.log(...arr2);//[1,2,3] [4,5,6] [7,8,9]
res = [].concat(...arr2)//[].concat([1,2,3],[4,5,6],[7,8,9])
console.log(res);//[1, 2, 3, 4, 5, 6, 7, 8, 9]
- 方法三:递归
var arr = [1,2,[3,4,5,[6,7,8],9],10,[11,12]];
function fn(arr){
let arr1 = []
arr.forEach((val)=>{
if(val instanceof Array){
arr1 = arr1.concat(fn(val))
//[1,2].concat([3,4,5].concat(fn([6,7,8])))
}else{
arr1.push(val)
}
})
return arr1
}
- 方法四:ES6 的 flat 方法
function flatten(arr) {
return arr.flat(Infinity);
}
//解析:
var arr1 = [1, 2, [3, 4]];
arr1.flat(); // [1, 2, 3, 4]
var arr2 = [1, 2, [3, 4, [5, 6]]];
arr2.flat();// [1, 2, 3, 4, [5, 6]] 默认展开一层深度
var arr3 = [1, 2, [3, 4, [5, 6]]];
arr3.flat(2);// [1, 2, 3, 4, 5, 6]
arr3.flat(Infinity); //使用 Infinity 作为深度,展开任意深度的嵌套数组
- 方法五:reduce
前序知识:reduce 方法 + 递归
arr.reduce((total,curItem,curIndex,arr)=>{return ....},initialTotal)
//计算每一位四舍五入的和 arr = [1.3,5.0,66.8]
function fun(arr){
return arr.reduce((pre,cur)=>{
return pre + Math.round(cur)
},0)
}
reduce + 递归实现数组拍平
function flatten(arr) {
return arr.reduce((pre,cur)=>{
pre.concat(cur instanceof Array?flatten(cur):)
},[])
}