如何写一个 flatten

  1. 普通的递归
function flatten(arr) {
  let result = []
  const flattenInner = (arr) => {
    arr.forEach(value => {
      if (Array.isArray(value)) {
        flattenInner(value)
      } else {
        result.push(value)
      }
    })
  }
  flattenInner(arr)
  return result
}

内部有一个用于递归的函数, 递归地去处理类型是数组的元素

  1. 使用 reduce (内部还是递归)
const flatten = arr => {
  const result = arr.reduce((temp, value) => {
    if (Array.isArray(value)) {
      return temp.concat(flatten(value))
    }
    return temp.concat(value)
  }, [])
  return result
}

  1. 使用concat
    concat 是数组的方法, 它可以将多个数组(和/或)值连接成新数组,举个例子
[1, 2, 3, 4].concat(1, 2, [3, [4]])  // [1, 2, 3, 4, 1, 2, 3, [4]]

这个方法的实现思路是:只要这个数组内的元素还包含数组,就会对这个数组的元素在执行一次concat方法

const flatten = arr => {
  const isContainsArray = (arr) => {
    return arr.some(item => Array.isArray(item))
  }
  while (isContainsArray(arr)) {
    arr = [].concat(...arr)
  }
  return arr
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容