如何在不创建新数组的情况下扩展现有的 JavaScript 数组

55 浏览
0 Comments

如何在不创建新数组的情况下扩展现有的 JavaScript 数组

似乎没有一种方法可以使用另一个数组扩展现有的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)方法,但它创建一个新数组,而不是仅仅扩展第一个数组。我希望有一种算法,当ab大得多时可以高效工作(即不需要复制a)。

注意:这与如何向数组附加内容?不是重复的问题--这里的目标是将一个数组的全部内容添加到另一个数组中,并且“原地”进行,即不复制扩展数组的所有元素。

admin 更改状态以发布 2023年5月20日
0
0 Comments

更新于2018年我的新回答更好:a.push(...b)。请不要再赞这个回答了,因为它从来没有真正回答这个问题,只是一个2015年在Google上的hack 🙂


对于那些只是搜索“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];

(它也会复制。)

0
0 Comments

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

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

如果您的浏览器不支持ECMAScript 6,则可以使用.apply代替:

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

或者,如果您认为这更清晰:

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

请注意,如果数组b太长,所有这些解决方案都将失败并引发堆栈溢出错误(在大约100,000个元素左右(取决于浏览器)开始出现问题)。
如果您无法保证b足够短,那么您应该使用另一个答案中描述的基于循环的标准技术。

0