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])代码>
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);