【发布时间】: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
是否有一种内置方法可以像这样将一个列表附加到另一个列表中:
var a = [1,2,3];
a.append([4,5]);
// now a is [1,2,3,4,5];
concat() 做了类似的事情,但返回结果。我想要修改现有列表的东西,例如push()
【问题讨论】:
标签: javascript
push 可以,但您还需要使用apply。
var a = [1,2,3];
a.push.apply(a, [4,5])
【讨论】:
Array.prototype.push.apply。
a.push.apply 也可以。我显然分裂了差异。
apply 的 MDC 文档(链接到答案)应该涵盖它。阅读它,如果您需要更多信息,请告诉我。
[].push.apply() 的冗余度较低(即不使用数组名两次),但仍比使用Array.prototyp.push.apply() 短。 -- 根据 JSPerf 测试“concat vs push.apply”,它的效率也很高。
var list = [1, 2];
人们已经向您展示了如何做到这一点:
list.push.apply(list, [3, 4]);
list = list.concat([4, 5]);
但我想告诉你ES6 spread operator:list.push(...[3, 4]);。
请记住,目前支持它的浏览器并不多(您可以使用转译器)。
【讨论】:
list.push.apply 方法会快得多。
如果你使用的是 ES6,你可以使用扩展运算符
例如:-
listOne = [1,2,3]
listTwo = [4,5,6]
listTwo.push(...listOne)
【讨论】:
这个怎么样:
var a = [1, 2, 3];
a = a.concat([4, 5]);
// a is now [1, 2, 3, 4, 5]
【讨论】:
concat 是奇怪效率低下! [jsperf.com/concat-vs-push-apply/10]
因为我刚刚编写了一个 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);
很遗憾,如果您想将数组/列表连接到 多个 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 中则慢一些。
【讨论】: