数组扁平化问题:
数组扁平化是指将一个多维数组变为一维数组
var arr = [2, [3, 4], [5, [6,7], 8], 9, 0]
输出为[2,3,4,5,6,7,8,9,0]
1. for-in
利用for-in的遍历机制,和递归调用
var newArr = []
function f(arr){
for(val of arr){
// console.log(val,"val")
if(typeof(val)=='number'){
newArr.push(val)
// console.log(val,"n")
}else{
f(val)
// console.log(val,"shuzu")
}
}
return newArr
}
let res = f(a)
console.log(res)
[ 2, 3, 4, 5, 6, 7, 8, 9, 0 ]
2.reduce()
function flatten2(arr) {
return arr.reduce((result, item)=> {
return result.concat(Array.isArray(item) ? flatten2(item) : item);
}, []);
}
reduce方法:
语法:
array.reduce(function(total, currentValue, currentIndex, arr), initialValue)
参数:
参数 | 描述 |
---|---|
function(total,currentValue, index,arr) | 必需。用于执行每个数组元素的函数 |
initialValue | 可选。传递给函数的初始值 |
回调函数参数:
参数 | 描述 |
---|---|
total | 必需。初始值, 或者计算结束后的返回值 |
currentValue | 必需。当前元素 |
currentIndex | 可选。当前元素的索引 |
arr | 可选。当前元素所属的数组对象 |
concat方法:
作用:是数组的方法,用来给拼接数组。参数是数组时实现两个数组的拼接,参数是多个数字时是在原数组后拼接这些数字。
例:arr.concat([2,3])或arr.concat(2,3)
3.toString()
function flatten3(arr) {
return arr.toString().split(',').map((item)=>{
return Number(item)
})
}
- toString()方法:
由于每个类型下面都重写了toString()方法,而Array下面的toString方法就可以把数组的元素转换成字符串,Array.prototype.toString()。 - map()详见:https://blog.csdn.net/qq_43198793/article/details/109327996
4.join()
类似于toString()方法,把数组先转化为字符串
function flatten4(arr) {
return arr.join().split(',').map((item)=>{
return Number(item)
})
}
5.解构
- …arr可以将二维数组解构成一维数组。
- 判断数组中的元素是否还有数组,有的话就继续递归解构。
function flatten6(arr) {
while(arr.some(item=>Array.isArray(item))) {
arr = [].concat(...arr);
}
return arr;
}
6.flat()
arr.flat()