Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript:推送整个列表?_Javascript - Fatal编程技术网

Javascript:推送整个列表?

Javascript:推送整个列表?,javascript,Javascript,是否有一种内置方法可以将一个列表附加到另一个列表中,如下所示: var a = [1,2,3]; a.append([4,5]); // now a is [1,2,3,4,5]; concat()执行类似操作,但返回结果。我想要一些可以修改现有列表的东西,比如push()这个怎么样: var a = [1, 2, 3]; a = a.concat([4, 5]); // a is now [1, 2, 3, 4, 5] push将起作用,但您也需要使用 人们已经向您展示了如何使用: 推送:

是否有一种内置方法可以将一个列表附加到另一个列表中,如下所示:

var a = [1,2,3];
a.append([4,5]);
// now a is [1,2,3,4,5];
concat()
执行类似操作,但返回结果。我想要一些可以修改现有列表的东西,比如
push()

这个怎么样:

var a = [1, 2, 3];
a = a.concat([4, 5]);
// a is now [1, 2, 3, 4, 5]

push
将起作用,但您也需要使用

人们已经向您展示了如何使用:

  • 推送:
    list.push.apply(list[3,4])
  • concat:
    list=list.concat([4,5])
  • 但是我想告诉大家:
    list.push(…[3,4])


    请记住,目前没有多少浏览器支持它(您可以使用transpilers)。

    如果您使用的是ES6,则可以使用spread操作符

    例如:-


    因为我刚刚编写了一个web应用程序,其中必须连接许多阵列,并且性能至关重要,所以我测试了哪种方法最快。结果很有趣

    在我的测试中,我将10个元素添加到10000个元素的列表或数组中

    下面是测试用例,从最快到最慢。结果在Chrome 62中测量,但Firefox 47的性能类似:

    • LinkedList.prototype.concat
      :90313485次/秒

      list.concat(concatList);
      // This function has to change only 1-2 refences
      
    • Array.prototype.push
      for循环中:3794962次/秒

      for (var i = 0, len = concatArr.length; i < len; i++) {
          array.push(concatArr[i]);
      }
      // Probably fastest in real life
      
    • Array.prototype.concat
      :22701次/秒

      array = array.concat(concatArr);
      
    不幸的是,如果要将数组/列表压缩为多个链接列表,则链接列表的版本不起作用。如果必须在每次concat操作之前将数组复制到
    LinkedList
    ,那么它也没有任何好处。因此,对我来说,赢家是for loop

    不使用
    Array.prototype.push.apply
    的一个原因是,如果连接的数组太大,它将失败。据介绍,连接的数组在Firefox中不能超过500000个元素,在Chrome中不能超过150000个元素


    我排除了,因为不是所有浏览器都支持它。在Chrome中,它的速度和<代码> >数组.Primult.Posi.Apdio< <代码>相比,在Firefox中有一点慢。

    不能一个一个地推它们一个更有效率吗?@ SuoSH,是的,可能更有效。在连接之前考虑下面的代码:var B=A;变量a改变了,但b仍然是1,2,3。哇!使用
    concat
    效率非常低![两年后,Chrome37和IE11都报告concat比push-apply快67%…可能是的重复,我想这需要是
    Array.prototype.push.apply
    。@lonesomeday:你想得对。
    a.push.apply
    也可以工作。我显然把两者的区别分开了。@Kooilnc:(答案中链接到)应该包括它。阅读它,如果您需要更多,请告诉我。没关系,忘记了argsarray它的冗余度较低(即不使用数组名称两次),但仍然比使用
    数组短。prototyp.push.apply()
    是使用
    [].push.apply()
    ——并且根据JSPerf测试“它也非常有效。我发现,如果你的数组非常大,而你只插入了大约5-20个元素,
    list.push.apply
    方法的速度要快得多。@Aloso谢谢,你可以用相应的基准将其作为一个答案发布(看到“非常快”和“非常大”后面的数字会很好)我不认为这值得一个完整的答案。但是,我做了一个测试速度的jsperf:好的,还有更多,所以我将添加一个答案。非常有趣,谢谢
    list.concat(concatList);
    // This function has to change only 1-2 refences
    
    for (var i = 0, len = concatArr.length; i < len; i++) {
        array.push(concatArr[i]);
    }
    // Probably fastest in real life
    
    array.push.apply(array, concatArr);
    
    array = array.concat(concatArr);