当面试官让你手写flat,是在考察什么

在面试者中,偶尔会遇到手写flat实现的面试题,如果基础不牢,或者没有准备,就容易挂。那么,这道典型的手写题,主要考察了些什么呢?本文一层层地剖析,让你豁然开朗。

考察点1: 熟不熟悉这个api

要想写出flat的实现,那么首先必须知道它,否则就直接挂了。

flat是数组原型上的一个方法,即Array.prototype.flat。根据mdn解释,flat() 方法创建一个新的数组,并根据指定深度递归地将所有子数组元素拼接到新的数组中。

通俗的说,flat方法就是将数组展开。

展开指的是如果数组元素也是数组,那么会遍历下去,将最终结果存储到新的数组中。这里遍历的层数可以指定。

考察点2: 默认展开几层

flat并非是展开所有层次,而是接收一个参数,这个参数指定展开几层。默认值为1,即默认只展开一层。

这就是说,如果某项数组成员A是数组,A的某项数组成员B还是数组,那么只会将A展开,而不会将B展开,代码案例如下:

const arr2 = [1, 2, [3, 4, [5, 6]]];
arr2.flat();
// [1, 2, 3, 4, [5, 6]]

考察点3:递归

由于数组需要展开的层数不确定,因此我们需要用到递归.本文主要讲的常规思路,因此这里不去讨论非递归的实现,例如栈等。

显然,递归是很容易理解的,如果没有展开完整,那么继续对需要展开的那项调用函数自身即可。

const myflat = arr =>{
    return arr.reduce((pre,cur)=>{
        return pre.concat(Array.isArray(cur) ? myflat(cur) : cur);
    },[]);
};

综合考察点2,我们需要增加一个展开层数的参数:

function myflat(arr,num = 1){
    return num > 0 
        ? arr.reduce((pre,cur) =>{
        pre.concat(Array.isArray(cur) ? myflat(cur,num-1):cur)
    	},[]) 
    	: arr.slice(); 
}


这里如果层数小于1,那么相当于不展开,因此使用arr.slice得到一个浅拷贝后的新数组。

另外,在递归的时候,每次递归都深入了一层,因此在递归时应该使层数减1

考察点四 累积

在上面的案例中,我们使用了reduce是因为reduce自带累加器参数,省去了我们声明累加器参数的过程,更为简洁。当然,使用forEach配合累积变量也是可以的。

这样,一个常规型的手写就已经实现了。

猜你喜欢

转载自blog.csdn.net/u012443286/article/details/129901153