Javascript:推送整个列表?
Posted
技术标签:
【中文标题】Javascript:推送整个列表?【英文标题】:Javascript: push an entire list? 【发布时间】:2011-06-18 02:21:12 【问题描述】:是否有一种内置方法可以像这样将一个列表附加到另一个列表中:
var a = [1,2,3];
a.append([4,5]);
// now a is [1,2,3,4,5];
concat()
做了类似的事情,但返回结果。我想要修改现有列表的东西,例如push()
【问题讨论】:
javascript push array values into another array、how to do a “flat push” in javascript? 的可能副本 【参考方案1】:push
可以,但您还需要使用apply
。
var a = [1,2,3];
a.push.apply(a, [4,5])
【讨论】:
我想应该是Array.prototype.push.apply
。
@lonesomeday:你想的没错。 a.push.apply
也可以。我显然分裂了差异。
@Kooilnc:apply
的 MDC 文档(链接到答案)应该涵盖它。阅读它,如果您需要更多信息,请告诉我。
没关系,忘了argsArray
使用[].push.apply()
的冗余度较低(即不使用数组名两次),但仍比使用Array.prototyp.push.apply()
短。 -- 根据 JSPerf 测试“concat vs push.apply”,它的效率也很高。【参考方案2】:
var list = [1, 2];
人们已经向您展示了如何做到这一点:
-
推送:
list.push.apply(list, [3, 4]);
连接:list = list.concat([4, 5]);
但我想告诉你ES6 spread operator:list.push(...[3, 4]);
。
请记住,目前支持它的浏览器并不多(您可以使用转译器)。
【讨论】:
我发现,如果你的数组非常大并且只插入大约 5-20 个元素,list.push.apply
方法会快得多。
@Aloso 谢谢,您可以将其发布为带有相应基准的答案(很高兴看到“非常快”和“非常大”背后的数字
我认为这不值得一个完整的答案。不过,我做了一个jsperf来测试速度:jsperf.com/array-vs-linkedlist-concat
好的,还有更多,所以我将添加一个答案。【参考方案3】:
如果你使用的是 ES6,你可以使用扩展运算符
例如:-
listOne = [1,2,3]
listTwo = [4,5,6]
listTwo.push(...listOne)
【讨论】:
【参考方案4】:这个怎么样:
var a = [1, 2, 3];
a = a.concat([4, 5]);
// a is now [1, 2, 3, 4, 5]
【讨论】:
一个接一个地推他们不是更有效率吗? @shoosh,是的,可能会更有效率。 在连接之前考虑以下代码: var b = a;变量 a 发生了变化,但 b 仍然是 1、2、3。example 哇!使用concat
是奇怪效率低下! [jsperf.com/concat-vs-push-apply/10]
两年后 Chrome 37 和 IE11 都报告 concat 比 push apply 快 67%...【参考方案5】:
因为我刚刚编写了一个 Web 应用程序,其中必须连接许多数组并且性能至关重要,所以我测试了哪种方法最快 in this jsperf。结果很有趣。
在我的测试中,我将 10 个元素添加到包含 10,000 个元素的列表或数组中。
这里是测试用例,从最快到最慢。结果是在 Chrome 62 中测量的,但 Firefox 47 的表现类似:
LinkedList.prototype.concat
:90,313,485 次操作/秒
list.concat(concatList);
// This function has to change only 1-2 refences
Array.prototype.push
在 for 循环中:3,794,962 ops/sec
for (var i = 0, len = concatArr.length; i < len; i++)
array.push(concatArr[i]);
// Probably fastest in real life
Array.prototype.push.apply
:2,193,469 次操作/秒
array.push.apply(array, concatArr);
Array.prototype.concat
:22,701 次操作/秒
array = array.concat(concatArr);
很遗憾,如果您想将数组/列表连接到 多个 LinkedList
s,LinkedList
版本将不起作用。如果必须在每次 concat 操作之前将数组复制到 LinkedList
,它也没有任何好处。所以,对我来说,获胜者是 for 循环。
不使用Array.prototype.push.apply
的一个原因是,如果串联数组太大,它会失败。根据this answer 的说法,连接数组在 Firefox 中不能超过 500,000 个元素,在 Chrome 中不能超过 150,000 个元素。
我排除了spread operator,因为并非所有浏览器都支持它。在 Chrome 中,它与 Array.prototype.push.apply
差不多快,在 Firefox 中则慢一些。
【讨论】:
以上是关于Javascript:推送整个列表?的主要内容,如果未能解决你的问题,请参考以下文章
Javascript,追加节点添加整个数组而不是最后一个元素