arr.flat([depth])
depth表示展开深度,默认为1,也可以传入Infinity(无限大,所以无论多少层都可以展开)。
flat内部使用reduce方法。
var testArr = [1, [2, [3, [4, [5, [6, [7, [[[[[[8, ['ha']]]]]]]]]]]]]];
let newTestArr = testArr.flat(Infinity) // 这里传入无限大
console.log(newTestArr); // [1, 2, 3, 4, 5, 6, 7, 8, 'ha']
内部原理
function flatFn(arr){
return arr.reduce((result,item)=>{
return result.concat(Array.isArray(item) ? flatFn(item) : item)
}, [])
}
// 数组扁平化 flat(ES6)
var testArr = [1, [2, [3, [4, [5, [6, [7, [[[[[[8, ['ha']]]]]]]]]]]]]];
let newTestArr = testArr.flat(Infinity)
// console.log(newTestArr); // [1, 2, 3, 4, 5, 6, 7, 8, 'ha']
function flatFn(arr){
return arr.reduce((initVal,currentItem)=>{
console.log('initVal==', initVal); // 初始值,或者计算结束后的返回值
console.log('currentItem==', currentItem); // 当前元素
return initVal.concat(Array.isArray(currentItem) ? flatFn(currentItem) : currentItem)
},[]) // []是传递给函数的初始值
}
console.log(flatFn(testArr), '///////////'); // [1, 2, 3, 4, 5, 6, 7, 8, 'ha'] '///////////'