前端练习22 数组展平

知识点

  1. concat方法可以接受数组作为参数,也可以接受非数组成员作为对象
  2. 递归
  3. reduce方法
  4. 判断数组类型

题目

编写一个JavaScript函数,接受一个仅包含数字的多维数组,返回拍平以后的结果。例如传入:[1, [[2], 3, 4], 5],返回[1, 2, 3, 4, 5]

实现

明显要通过递归实现,可以使用reduce方法,它可以保存当前只执行过的结果在total中,如果当前项目current仍然是数组,那么需要将递归执行的结果与total拼接

const flatten = (arr) => {
  if (!Array.isArray(arr) || arr.length === 0) {
    return [];
  }
  return arr.reduce((total, current) => {
    return total.concat(Array.isArray(current) ? flatten(current) : current);
  }, [])
};

另一种方法

可以不使用reduce方法,通过递归调用传入一个数组来,通过这个数组保存结果,拼接数组

const flatten = (arr, result = []) => {
  if (!Array.isArray(arr) || arr.length === 0) {
    return [];
  }
  arr.forEach(v => {
    if (Array.isArray(v)) {
      flatten(v, result)
    } else {
      result.push(v);
    }
  });
  return result;
};

也可以构造一个闭包,通过闭包中的变量来传递结果

const flatten = (arr, result = []) => {
  return (function inner(innerArr) {
    if (!Array.isArray(innerArr) || innerArr.length === 0) {
      return [];
    }
    innerArr.forEach(v => {
      if (Array.isArray(v)) {
        inner(v)
      } else {
        result.push(v);
      }
    });
    return result;
  })(arr)
};

参考

  • 33 数组拍平@ScriptOJ

你可能感兴趣的:(前端练习)