有没有内置的方法可以像这样将一个列表追加到另一个列表中:
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.append([4,5]);
// now a is [1,2,3,4,5];
concat()
做了类似的事情,但返回结果。我想要像push()
一样修改现有列表的内容。
push
能够工作,但你还需要使用 apply
。
var a = [1,2,3];
a.push.apply(a, [4,5])
Array.prototype.push.apply
。 - lonesomedaya.push.apply
也可以。我显然两者都用了一下。 - outisapply
的MDC文档(在答案中链接)应该已经涵盖了它。阅读一下,如果需要更多帮助,请告诉我。 - outisArray.prototyp.push.apply()
更短,就是使用[].push.apply()
。根据JSPerf测试“[concat vs push.apply](http://jsperf.com/concat-vs-push-apply/11)”,它也非常高效。 - zrajmlistOne = [1,2,3]
listTwo = [4,5,6]
listTwo.push(...listOne)
var list = [1, 2];
人们已经向您展示了以下方法:
list.push.apply(list, [3, 4]);
list = list.concat([4, 5]);
但是我想告诉你关于 ES6扩展运算符: list.push(...[3, 4]);
.
请记住,目前并不是所有浏览器都支持它(您可以使用转换器)。
list.push.apply
方法会极大地提高速度。 - AlosoLinkedList.prototype.concat
: 90,313,485 ops/sec
list.concat(concatList);
// This function has to change only 1-2 refences
Array.prototype.push
in a for loop: 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 ops/sec
array.push.apply(array, concatArr);
Array.prototype.concat
: 22,701 ops/sec
array = array.concat(concatArr);
LinkedList
中,LinkedList
版本无法使用。如果在每次连接操作之前必须将数组复制到LinkedList
中,则也没有任何好处。因此,对我来说,胜利者是for循环。
不使用Array.prototype.push.apply
的原因之一是,如果连接的数组太大,则会失败。根据此答案,Firefox中连接的数组不能超过500,000个元素,Chrome中不能超过150,000个元素。
我排除了展开运算符,因为它并不被所有浏览器支持。在Chrome中,它的速度与Array.prototype.push.apply
差不多,在Firefox中略慢。
var a = [1, 2, 3];
a = a.concat([4, 5]);
// a is now [1, 2, 3, 4, 5]
concat
竟然效率如此低下![http://jsperf.com/concat-vs-push-apply/10] - zrajma.concat
不会修改数组 - 代码var a = [1, 2, 3]; var b = a; a = a.concat([4, 5]);
导致a
不引用与b
相同的对象,而b
的对象没有[4, 5]
。 - wizzwizz4