拍平数组

      const arr = [1, [2, [3, [4, 5]]], 6]

      // 使用原生的flat
      console.log(arr.flat(Infinity)) // [1, 2, 3, 4, 5, 6]

      // 使用扩展运算符
      function myFlat1(arr) {
        while (arr.some((item) => Array.isArray(item))) {
          arr = [].concat(...arr)
        }
        return arr
      }
      console.log('myFlat1', myFlat1(arr)) // [1, 2, 3, 4, 5, 6]

      // 使用reduce
      function myFlat2(arr) {
        return arr.reduce((prev, cur) => {
          return prev.concat(Array.isArray(cur) ? myFlat2(cur) : cur)
        }, [])
      }
      console.log('myFlat2', myFlat2(arr)) // [1, 2, 3, 4, 5, 6]

      // 使用递归
      function myFlat3(arr) {
        let result = []
        for (let i = 0; i < arr.length; i++) {
          if (Array.isArray(arr[i])) {
            result = result.concat(myFlat3(arr[i]))
          } else {
            result.push(arr[i])
          }
        }
        return result
      }
      console.log('myFlat3', myFlat3(arr)) // [1, 2, 3, 4, 5, 6]

      // 使用栈
      function myFlat4(arr) {
        const result = []
        const stack = [...arr]
        while (stack.length) {
          const item = stack.pop()
          if (Array.isArray(item)) {
            stack.push(...item)
          } else {
            result.unshift(item)
          }
        }
        return result
      }
      console.log('myFlat4', myFlat4(arr)) // [1, 2, 3, 4, 5, 6]

      // 使用 Generator 实现 flat 函数
      function* myFlat5(arr) {
        for (let i = 0; i < arr.length; i++) {
          if (Array.isArray(arr[i])) {
            yield* myFlat5(arr[i])
          } else {
            yield arr[i]
          }
        }
      }
      console.log('myFlat5', [...myFlat5(arr)]) // [1, 2, 3, 4, 5, 6]

      // 使用toString
      function myFlat6(arr) {
        return arr
          .toString()
          .split(',')
          .map((item) => +item)
      }
      console.log('myFlat6', myFlat6(arr)) // [1, 2, 3, 4, 5, 6]

      // 使用正则
      function myFlat7(arr) {
        return JSON.parse('[' + JSON.stringify(arr).replace(/\[|\]/g, '') + ']')
      }
      console.log('myFlat7', myFlat7(arr)) // [1, 2, 3, 4, 5, 6]

      // 通过传入整数参数控制 拍平层数
      function myFlat8(arr, depth = 1) {
        return arr.reduce((prev, cur) => {
          return prev.concat(depth > 1 && Array.isArray(cur) ? myFlat8(cur, depth - 1) : cur)
        }, [])
      }
      console.log('myFlat8 1', myFlat8(arr, 1)) // [1, 2, [3, [4, 5]], 6]
      console.log('myFlat8 2', myFlat8(arr, 2)) // [1, 2, 3, [4, 5], 6]
      console.log('myFlat8 3', myFlat8(arr, 3)) // [1, 2, 3, 4, 5, 6]