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.pushfor 循环中: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);

很遗憾,如果您想将数组/列表连接到 多个 LinkedLists,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语法

用户通过触摸收到的推送通知打开应用程序

学习Javascript

Javascript,追加节点添加整个数组而不是最后一个元素

使用javascript将数据推送到firebase数据库列表中时如何保存对象uid

HTTP 2.0 服务器推送技术的创新