数组扁平化

  • 涉及无限次操作的一定会用到递归

原生API

返回一个拍平后的新数组
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/flat

let arr = [3, 4, [4, 5, ['s']]]
arr.flat(2)  //拍平2层, 不传参数默认拍平1层
arr.flat(Infinity) // 拍平任意层

concat实现

function flat(arr) {
  let res = []
  arr.forEach(item => {
    res = res.concat(Array.isArray(item) ? flat(item) : item)
  })
  return res
}

reduce 实现

function flat(arr) {
  return arr.reduce((pre, cur) => pre.concat(Array.isArray(cur) ? flat(cur) : cur), [])
}

栈实现

function flat(arr) {
  const res = []
  const stack = [].concat(arr)
  while (stack.length) {
    const item = stack.pop()
    if (Array.isArray(item)) {
      stack.push(...item)
    } else {
      res.unshift(item)
    }
  }
  return res
}

可控制扁平化层数

// reduce + 递归
function flat(arr, num = 1) {
  return num > 0
    ? arr.reduce(
      (pre, cur) =>
        pre.concat(Array.isArray(cur) ? flat(cur, num - 1) : cur),
      []
    )
    : arr.slice();
}

在原数组上进行操作

function flat(arr) {
  let i = 0
  while (i < arr.length) {
    if (Array.isArray(arr[i])) {
      let tmp = flat(arr[i])
      arr.splice(i, 1, ...tmp)
      i += tmp.length
    }
    i++
  }
  return arr
}

参考链接:
https://segmentfault.com/a/1190000021366004

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 法一:使用es6种Array新增flat()方法。flat()方法接受一个参数,指定要提取嵌套数组的结构深度,默认...
    起风了啰阅读 149评论 0 0
  • 数组 知识汇总 前置知识: 数组是一个有序的数据集合,可使用数组名称和索引进行访问。 在JavaScript中数组...
    Daeeman阅读 898评论 1 8
  • 前言 数组是 JS 中使用频率仅次于对象的数据结构,官方提供了众多的 API,今天我们来谈谈如何扁平化(flatt...
    云峰yf阅读 21,690评论 0 12
  • 一.Array对象方法 Array 对象方法 .concat()[https://segmentfault.com...
    Angel_6c4e阅读 769评论 0 0
  • 列举一下JavaScript数组和对象有哪些原生方法? 数组: arr.concat(arr1, arr2, ar...
    Angel_6c4e阅读 3,139评论 1 44

友情链接更多精彩内容