zoukankan      html  css  js  c++  java
  • 展开合并全都是数组元素的数组

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

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

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

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

      

  • 相关阅读:
    sql like模糊查询
    mysql没有delete操作,那是delete from操作,
    j详细说明ava于clone办法
    基于ZooKeeper的Dubbo简单抽样登记中心
    度小于所述过程:es.exe
    Android 支付宝钱包手势password裂纹战斗
    How draw a stem -and -leaf & box-plot display by R.or Python
    POJ 2420 A Star not a Tree? (模拟退火)
    记userscripts.org
    基于最简单的FFmpeg包封过程:视频和音频分配器启动(demuxer-simple)
  • 原文地址:https://www.cnblogs.com/zhuhuoxingguang/p/10149833.html
Copyright © 2011-2022 走看看