前面写过一篇《数组内元素全都是数组,展开并合并》,再看看好像全都是废话,于是呢?想着是不是应该封装一下,那么,动手吧!

我们最终需要解决的问题大概是这个样子的:

[[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)
}

  同样,能够完成这一目标。

 

  

 

posted on 2018-12-20 15:47  烛火星光  阅读(404)  评论(0编辑  收藏  举报