如何使用另一个数组扩展现有的 JavaScript 数组,而不创建新数组

2022-08-29 22:03:15

似乎没有办法用另一个数组扩展现有的JavaScript数组,即模拟Python的方法。extend

我想实现以下目标:

>>> a = [1, 2]
[1, 2]
>>> b = [3, 4, 5]
[3, 4, 5]
>>> SOMETHING HERE
>>> a
[1, 2, 3, 4, 5]

我知道有一种方法,但它会创建一个新数组,而不是简单地扩展第一个数组。我想要一种算法,当明显大于(即不复制的算法)时,该算法可以有效地工作。a.concat(b)aba

注意:这不是如何将某些内容附加到数组的副本? - 这里的目标是将一个数组的全部内容添加到另一个数组中,并“就地”完成,即不复制扩展数组的所有元素。


答案 1

.push 方法可以采用多个参数。可以使用展开运算符将第二个数组的所有元素作为参数传递给 :.push

>>> a.push(...b)

如果您的浏览器不支持 ECMAScript 6,则可以改用 .apply

>>> a.push.apply(a, b)

或者,如果您认为它更清晰,

>>> Array.prototype.push.apply(a,b)

请注意,如果数组太长,所有这些解决方案都将失败并显示堆栈溢出错误(问题从大约100,000个元素开始,具体取决于浏览器)。
如果不能保证它足够短,则应使用其他答案中描述的基于循环的标准技术。bb


答案 2

2018年更新一个更好的答案是我更新的答案a.push(...不要再投票了,因为它从来没有真正回答过这个问题,但它是2015年围绕Google首次点击:)


对于那些只是搜索“JavaScript数组扩展”并到达这里的人来说,你可以很好地使用。Array.concat

var a = [1, 2, 3];
a = a.concat([5, 4, 3]);

Concat 将返回新数组的副本,因为线程启动器不需要。但你可能不在乎(当然对于大多数用途来说,这很好)。


还有一些不错的 ECMAScript 6 糖以传播运算符的形式呈现:

const a = [1, 2, 3];
const b = [...a, 5, 4, 3];

(它也会复制。