编程题:实现数组扁平化|刷题打卡

658 阅读1分钟

一、题目要求

输入:

const arr = [1, [2, 3], [4, [5, 6, [7, 8]]]];

输出:

const result = flattern(arr);
// [1, 2, 3, 4, 5, 6, 7, 8]; 

要求实现flattern方法。

二、实现

方法一:递归法

首先能想到的就是以递归的方式处理。

function flattern(arr) {
  let result = [];
  arr.forEach(item=>{
    if (Array.isArray(item)) {
      result = result.concat(arrayFlattern(item));
    } else {
      result.push(item);
    }
  });
  return result;
}

方法二:reduce法

处理数组并且返回值也是一个数组,一般可以通过数组是reduce方法来处理,reduce属于函数式编程的范畴,代码可读性很高。

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

方法三:stack法

也可以借助一个堆栈的数据结构用于存储数组,然后使用while循环来遍历这个栈结构,在循环内从头部取出一个元素进行判断当前元素是否为数组类型,如果是数组则利用展开运算符可以打平一层数组的特性,将打平的数组放到stack中,如果不是数组类型则push到结果数组中。直到stack中没有元素为止。

function flattern(arr) {
  const stack = [...arr];
  let res = [];
  while (stack.length) {
    const next = stack.shift();
    if (Array.isArray(next)) {
      stack.push(...next);
    } else {
      res.push(next);
    }
  }
  return res;
}

测试代码

测试一下

function test() {
  const arr = [1, [2, 3], [4, [5, 6, [7, 8]]]];
  
  // const res = flattern(arr);
  //const res = flattern1(arr);
  const res = flattern2(arr);
  console.log(res);
}

test();