多维数组降维的几种方法

204 阅读1分钟

多维数组降维算是面试里面一个高频题,这里简单总结了几个方法以供参考

一、数组字符串化

let arr = [[222, 333, 444], [55, 66, 77]]
arr += ''
arr = arr.split(',')
console.log(arr) // ["222", "333", "444", "55", "66", "77"]

二、递归

function reduceDimension (arr) {
  const ret = []
  const toArr = function (arr) {
    arr.forEach(function (item) {
      item instanceof Array ? toArr(item) : ret.push(item)
    })
  }
  toArr(arr)
  return ret
}

三、Array.prototype.flat()

const arr1 = [1, 2, [3, 4]]
arr1.flat()
// [1, 2, 3, 4]
const arr2 = [1, 2, [3, 4, [5, 6]]]
arr2.flat()
// [1, 2, 3, 4, [5, 6]]
const arr3 = [1, 2, [3, 4, [5, 6]]]
arr3.flat(2)
// [1, 2, 3, 4, 5, 6]
// 使用 Infinity 作为深度,展开任意深度的嵌套数组
arr3.flat(Infinity)
// [1, 2, 3, 4, 5, 6]

四、使用 stack 无限反嵌套多层嵌套数组

const arr1 = [1, 2, 3, [1, 2, 3, 4, [2, 3, 4]]]
function flatten (input) {
  const stack = [...input]
  const res = []
  while (stack.length) {
    // 使用 pop 从 stack 中取出并移除值
    const next = stack.pop()
    if (Array.isArray(next)) {
      // 使用 push 送回内层数组中的元素,不会改动原始输入 original input
      stack.push(...next)
    } else {
      res.push(next)
    }
  }
  // 使用 reverse 恢复原数组的顺序
  return res.reverse()
}
flatten(arr1) // [1, 2, 3, 1, 2, 3, 4, 2, 3, 4]

五、使用 reduce、concat 和递归无限反嵌套多层嵌套的数组

const arr1 = [1, 2, 3, [1, 2, 3, 4, [2, 3, 4]]]
function flattenDeep (arr1) {
  return arr1.reduce(
    (acc, val) =>
      Array.isArray(val) ? acc.concat(flattenDeep(val)) : acc.concat(val),
    []
  )
}
flattenDeep(arr1)
// [1, 2, 3, 1, 2, 3, 4, 2, 3, 4]