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

我想达到以下几点:

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

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

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


当前回答

超级简单,不依赖扩展运算符或应用,如果这是一个问题。

b.map(x => a.push(x));

在运行了一些性能测试后,它非常慢,但回答了关于不创建新数组的问题。Concat的速度要快得多,甚至jQuery的$.merge()也不行。

https://jsperf.com/merge-arrays19b/1

其他回答

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

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

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

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

或者,如果你觉得更清楚的话:

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

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

首先介绍一下JavaScript中的apply(),帮助我们理解为什么要使用它:

apply()方法调用具有给定此值的函数,并且 作为数组提供的参数。

Push需要一个要添加到数组的项列表。然而,apply()方法将函数调用的预期参数作为一个数组。这允许我们使用内置的push()方法轻松地将一个数组的元素推入另一个数组。

假设你有这些数组:

var a = [1, 2, 3, 4];
var b = [5, 6, 7];

简单地这样做:

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

结果将是:

a = [1, 2, 3, 4, 5, 6, 7];

同样的事情可以在ES6中使用扩展操作符("…")完成,就像这样:

a.push(...b); //a = [1, 2, 3, 4, 5, 6, 7]; 

更短更好,但目前不是所有浏览器都完全支持。

同样,如果你想把所有的东西从数组b移动到a,在这个过程中清空b,你可以这样做:

while(b.length) {
  a.push(b.shift());
} 

结果如下:

a = [1, 2, 3, 4, 5, 6, 7];
b = [];

把答案结合起来……

Array.prototype.extend = function(array) {
    if (array.length < 150000) {
        this.push.apply(this, array)
    } else {
        for (var i = 0, len = array.length; i < len; ++i) {
            this.push(array[i]);
        };
    }  
}

只需在push()方法的帮助下向数组添加新元素就可以做到这一点。

let colors = ["Red", "Blue", "Orange"]; console.log(' push前数组:' + colors); //添加新值到数组 colors.push(“绿色”); console.log(' push后数组:' + colors);

另一个用于将元素追加到数组开头的方法是unshift()函数,它添加并返回新的长度。它接受多个参数,附加现有元素的索引,最后返回数组的新长度:

let colors = ["Red", "Blue", "Orange"]; console.log(' unshift前数组:' + colors); //添加新值到数组 颜色。未(“黑色”,“绿色”); console.log(' unshift后的数组:' + colors);

还有其他方法。你可以在这里查看。

可以使用splice()来实现:

b.unshift(b.length)
b.unshift(a.length)
Array.prototype.splice.apply(a,b) 
b.shift() // Restore b
b.shift() // 

但尽管它更丑,但并不比推快。至少在Firefox 3.0中不适用。