大厂面试题练习-数组扁平化


题目:数组扁平化

示例

输入:
[[1, 2, 2],[3, 4, 5, 5],[6, 7, 8, 9, [11, 12, [12, 13, [14]]]], 10]
输出:
[1,2,2,3,4,5,5,6,7,8,9,11,12,12,13,14,10]

答案

方法一:利用 flat 函数

let arr = let arr = [[1, 2, 2], [3, 4, 5, 5], [6, 7, 8, 9, [11, 12, [12, 13, [14]]]], 10];
// 该方法是ES6中新增的函数
let arr = arr.flat(Infinity);
console(arr);
// [ 1, 2, 2, 3, 4, 5, 5, 6, 7, 8, 9, 11, 12, 12, 13, 14, 10 ]

方法二:利用 toString 函数

let arr = let arr = [[1, 2, 2], [3, 4, 5, 5], [6, 7, 8, 9, [11, 12, [12, 13, [14]]]], 10];
arr = arr.toString().split(",").map((e) => Number(e));
console.log(arr);
// [ 1, 2, 2, 3, 4, 5, 5, 6, 7, 8, 9, 11, 12, 12, 13, 14, 10 ]

方法三:利用 JSON.stringfy 函数

let arr = let arr = [[1, 2, 2], [3, 4, 5, 5], [6, 7, 8, 9, [11, 12, [12, 13, [14]]]], 10];
arr = JSON.stringify(arr)
  .replace(/\[|\]/g, "")
  .split(",")
  .map((e) => Number(e));
console.log(arr);
// [ 1, 2, 2, 3, 4, 5, 5, 6, 7, 8, 9, 11, 12, 12, 13, 14, 10 ]

方法四:利用 cancat 函数

let arr = let arr = [[1, 2, 2], [3, 4, 5, 5], [6, 7, 8, 9, [11, 12, [12, 13, [14]]]], 10];
while (arr.some((item) => Array.isArray(item))) {
  arr = [].concat(...arr);
}
console.log(arr);
// [ 1, 2, 2, 3, 4, 5, 5, 6, 7, 8, 9, 11, 12, 12, 13, 14, 10 ]

方法五:利用递归

let arr = let arr = [[1, 2, 2], [3, 4, 5, 5], [6, 7, 8, 9, [11, 12, [12, 13, [14]]]], 10];
Array.prototype.flat = function myFlat() {
  let result = [];
  let fn = (arr) => {
    for (let i = 0; i < arr.length; i++) {
      //=>循环数组中的每一项,把不是数组的存储到新数组中
      const item = arr[i];
      if (Array.isArray(arr[i])) {
        fn(item);
        continue;
      }
      result.push(item);
    }
  };
  fn(this);
  return result;
};
console.log(arr.flat());
// [ 1, 2, 2, 3, 4, 5, 5, 6, 7, 8, 9, 11, 12, 12, 13, 14, 10 ]

方法六:reduce+递归

const flatten = (arr, deep = 1) => {
  return arr.reduce((cur, next) => {
    return Array.isArray(next) && deep > 1
      ? [...cur, ...flatten(next, deep - 1)]
      : [...cur, next];
  }, []);
};

文章作者: CassielLee
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 CassielLee !
评论
  目录