【前端手撕代码系列】扁平化数组

83 阅读1分钟

如何实现数组扁平化?

[1, [2, [3, [4, 5]]], 6] => [ 1, 2, 3, 4, 5, 6 ]
使用 ES6 的 flat 方法
const arr = [1, [2, [3, [4, 5]]], 6]
const flat = arr => {
  // Infinity 表示嵌套的层次全部展开
  return arr.flat(Infinity)
}
flat(arr) // [ 1, 2, 3, 4, 5, 6 ]
使用栈的思想实现 flat 函数
const arr = [1, [2, [3, [4, 5]]], 6]
const flat = arr => {
  const result = []
  while (arr.length) {
    const val = arr.pop()
    if (Array.isArray(val)) {
      arr.push(...val)
    } else {
      result.unshift(val)
    }
  }
  return result
}
console.log(flat(arr)) // [ 1, 2, 3, 4, 5, 6 ]
使用正则表达式
const arr = [1, [2, [3, [4, 5]]], 6]
const flat = arr => {
  const result = JSON.stringify(arr).replace(/\[|\]/g, '')
  return `[${result}]`
}
flat(arr) // [ 1, 2, 3, 4, 5, 6 ] 
使用递归
const arr = [1, [2, [3, [4, 5]]], 6]
const flat = (arr, result = []) => {
  for (let i = 0; i < arr.length; i++) {
    if (Array.isArray(arr[i])) {
      flat(arr[i], result)
    } else {
      result.push(arr[i])
    }
  }
  return result
}
console.log(flat(arr)) // [ 1, 2, 3, 4, 5, 6 ]
使用 reduce 方法
const arr = [1, [2, [3, [4, 5]]], 6]
const flat = arr => {
  return arr.reduce((pre, cur) => {
    return pre.concat(Array.isArray(cur) ? flat(cur) : cur)
  }, [])
}
console.log(flat(arr)) // [ 1, 2, 3, 4, 5, 6 ]