js数组扁平化的三种”姿势“

178 阅读2分钟

最近在看面试题的时候,看到一道让我记忆犹深的题目,让我咬牙切齿,食不能寐,今天就让我用多种”姿势”去征服她。

题目:实现js数组扁平化。

1. 使用Array.prototype.flat():
  1. Array.prototype.flat() 是 JavaScript 中的一个数组方法,ES2019中引入,它可以将多层嵌套的数组结构扁平化为单层数组。这个方法会按照指定的深度递归遍历数组,并将所有元素合并到一个新数组中。
  2. flat()方法接受一个可选的参数,表示要扁平化的深度,默认值为 1。
  3. 如果要完全扁平化一个多层嵌套的数组,可以传递Infinity作为参数,当传递Infinity作为参数时,无论数组嵌套有多深,flat()都会将它扁平化到一个单一数组中。
  4. 示例:
let arr = [1, [2, [3, [4, 5]]], 6];
let flatArr = arr.flat(Infinity);
2. 递归方法:
  1. 通过forEach去遍历数组
  2. 判断数组中的每一个元素
  3. 如果是数组,则重复第一步和第二步,并把执行完毕后返回的数据添加到结果数组里面。
  4. 如果不是则直接添加到结果数组里面。
  5. 返回结果数组。
  6. 示例:
  function flattenArray (arr) {
      let result = [];
      arr.forEach(item => {
        if (Array.isArray(item)) {
          result = result.concat(flattenArray(item));
        }else {
          result.push(item);
        }
      })
      return result;
    }
3. 使用reduce()和concat:
  1. 使用ES6的方法reduce,reduce() 是Array原型对象的一个方法。它用于将数组的所有元素缩减为单一的输出值。此方法通过执行一个提供的 reducer 函数(该函数同时接收四个参数:累加器、当前值、当前索引和源数组),对数组中的每个元素进行迭代处理。
  2. 初始化值为空数组[]。
  3. 数组调用reduce方法,传入reducer 函数,接受两个参数,累加值和当前值。
  4. 使用三元运算符,判断当前值是否为数组,如果是则调用自身函数,如果不是则累加值添加当前值。
  5. 示例:
  function flattenArray (arr) {
      return arr.reduce((acc, val) => Array.isArray(val) ? acc.concat(flattenArray(val)) : acc.concat(val), [])
  }

通过这三种姿势,成功的让征服了它(😊)。