前面写过一篇《数组内元素全都是数组,展开并合并》,再看看好像全都是废话,于是呢?想着是不是应该封装一下,那么,动手吧!
我们最终需要解决的问题大概是这个样子的:
[[1,2,3], [4,5]] => [1,2,3,4,5]
直白一点,就是一个数组内的元素全都是数组,通过函数调用返回一个由内部元素合并组成的新的数组。
前面的文章,有一点没有说错,无论如何,我们得借助函数的apply方法。
JavaScript函数有一个属性,arguments,关于arguments官方是这么解释的:
既然能用,那我们先用一下:
cat(){ let arr = Array.prototype.slice.call(arguments, 0) let first = arr[0] if (!!first) { return first.concat.apply(first, rest); } else { return []; } } expand(arr){ return this.cat.apply(this, arr) }
为了使用上的方便,我们定义了一个cat函数之后,又重新定义了expand函数,仅仅是为了后面函数调用的时候更加简单一点。
稍微解释一下
Array.prototype.slice.call(arguments, 0)
这是将arguments这一类数组对象,转化为数组,目的是为了我们后面能够使用数组的方法concat。
看着写了好几行的代码,核心代码其实只有一句: return first.concat.apply(first, rest);
first是当前传入的数组的第一个元素,然后就是利用cancat把后面所有元素合并过来,return出去即可。这就达到了我们的最终目的。
当然了,实现方法上还是有其他可变通的:首先就是转化类数组对象为数组,可以利用官方提供的方法: Array.from(arguments),甚至还有更多其他的办法,就不一一讨论了。
按照官方建议:尽量不要使用arguments这一属性的话,这就得使用到ES6的特性了。
const cat = (first,...rest) => { if(Array.isArray(first)){ return first.concat.apply(first, rest); }else{ return [first, ...rest] } } const expand = arr => { return cat.apply(this, arr) }
同样,能够完成这一目标。