在大厂笔试或者一面中,手写`flat`方法几乎成了一道经典的热身题。这个题目考察的是基本的编程能力,包括理解需求、递归思维和边界处理。这里先回顾一下官方的定义。Array.prototype.flat()通常被称为“数组拍平”,它的作用就是把多维数组给拍平成一维数组。如果不给参数,它默认只拍平一层;传一个整数指定层数,传Infinity表示无限拍平;传<=0的数则原样返回。原数组不会被修改,返回的是新数组。还有一点要注意的是,空位会被自动跳过。 把官方的方法拆成一些可复用的模块之后,我们就可以把这些模块拼起来写出自己的代码了。第一步是遍历原数组,把每一个子项都拿出来。我们可以用for循环、for...of、forEach、reduce或者map等方法来遍历。这里推荐使用reduce方法,因为它可以一边累加元素一边判断是否需要继续递归。 接下来是判断当前项是不是一个数组。常用的方法有instanceof、Object.prototype.toString.call和Array.isArray()。Array.isArray()是最简单也是最稳定的方式。 第三步是展开数组,把它变成逗号分隔的参数。扩展运算符...可以非常直观地完成这个操作。如果环境不支持扩展运算符的话,可以使用concat.apply来代替。 最后一步就是遇到数组的时候再调用自己进行递归处理。核心逻辑只有一句:如果当前项是数组就递归调用flat函数来处理它。 在写代码的时候最好先写注释再写逻辑,这样可以降低语法错误的几率。下面就是一段简单的实现代码: 这段代码只递归一层,但是通过reduce的闭包记忆机制,每次递归都在减少深度,最终就把多维数组给拍平了。在面试现场如果能写出这段代码就能拿到基础分。如果还想增加健壮性(比如处理空位或者循环引用),只需要在判断逻辑里再增加一步判断即可。