用reduce实现flat

1,338 阅读1分钟

普通 for 循环

var arr3 = [1, 2, [3, ,4, [5, [6]]]];

/**
 * 普通for循环
 *
 * @param arr
 * @param n
 * @returns {[]|*}
 */
function myFlat(arr, n= 1) {
  if (n <= 0 || arr.length <= 1) {
    return arr
  }

  let res = []
  let len = arr.length

  for (let i = 0; i < len; i++) {
    let item = arr[i]
    if (Array.isArray(item)) {
      res.push(...myFlat(item, n - 1))
    } else {
      res.push(item)
    }
  }

  return res
}

关于 reduce

/**
 * 关于 reduce
 * https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce
 * reduce 的作用就是逐个遍历元素【不包括数组中被删除或从未被赋值的元素】,然后返回处理的值结合下个元素继续处理,直到最后返回出来处理完最后一个元素的值
 * reduce 方法接受 2 个参数,第一个是个函数,第二个参数是初始 pre 值,这时第一轮的 cur 就是第0个元素
 * 没有传第二个参数的话,初始的 pre 值就是数组的第一个元素,然后第一轮的 cur 就是第1个元素
 * 或者说,注意:如果没有提供initialValue,reduce 会从索引1的地方开始执行 callback 方法,跳过第一个索引。如果提供initialValue,从索引0开始。
 * 然后当前一轮的返回值作为新的 pre 值进入下一轮循环
 * 空数组,且不传第二个参数时,执行reduce会报错。
 * 然后第一个函数接收 4 个参数,初始值,当前值,索引,数组
 * 
 */
console.log([1].reduce((pre, cur) =>{
  console.log(pre, cur)
  return pre + cur
}))

用 reduce 实现

/**
 * 用reduce实现flat
 * 
 * @param arr
 * @param n
 * @returns {*}
 */
function myFlat2(arr, n = 1) {
  if (n <= 0 || arr.length <= 1) {
    return arr
  }
  return arr.reduce((pre, cur) => {
    if (Array.isArray(cur)) {
      return pre.concat(myFlat2(cur, n - 1))
    }

    return pre.concat(cur)
  }, [])
}
var arr3 = [1, 2, [3, ,4, [5, [6]]]];
console.log(myFlat2(arr3, 2))