如何写一个 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
}

你可能感兴趣的:(如何写一个 flatten)