数组扁平化flat(ES6)

183 阅读1分钟

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'] '///////////'