似乎没有办法用另一个数组来扩展一个现有的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)。

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


当前回答

2018年更新:更好的答案是我的一个更新的答案:A .push(…b)。不要再给这个投票了,因为它从来没有真正回答过这个问题,但它是2015年关于谷歌第一次点击的黑客攻击:)


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

(它也复制。)

其他回答

我喜欢推。应用上面描述的(a, b)方法,如果你想,你可以创建一个这样的库函数:

Array.prototype.append = function(array)
{
    this.push.apply(this, array)
}

像这样使用它

a = [1,2]
b = [3,4]

a.append(b)

只需在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);

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

你可以创建一个polyfill for extend,如下所示。它会添加到数组中;In-place并返回自身,这样就可以链接其他方法。

如果(Array.prototype。Extend === undefined) { Array.prototype.extend = function(other) { this.push。应用(这个参数。长度> 1 ?论据:其他); 返回; }; } 函数print() { document.body.innerHTML += [].map。调用(参数,函数(项){ 返回typeof item === 'object' ?JSON.stringify(item): item; })。Join (' ') + '\n'; } document.body.innerHTML = "; Var a = [1,2,3]; Var b = [4,5,6]; 打印(“Concat”); print(“(1)”,a.concat (b)); print(“(2)”,a.concat (b)); Print ('(3)', a.c concat(4,5,6)); 打印(“\ nExtend”); print(“(1)”,a.extend (b)); print(“(2)”,a.extend (b)); Print ('(3)', a.extend(4,5,6)); 身体{ 字体类型:等宽字体; 空白:前; }

首先介绍一下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 = [];

我添加了这个答案,因为尽管这个问题没有创建一个新数组,但几乎每个答案都忽略了它。

现代JavaScript可以很好地处理数组等可迭代对象。这使得在此基础上实现一个版本的concat成为可能,并在逻辑上跨越数组数据的参数。

下面的例子使用了iter-ops库,它具有这样的逻辑:

import {pipe, concat} from 'iter-ops';

const i = pipe(
    originalArray,
    concat(array2, array3, array4, ...)
); //=> Iterable

for(const a of i) {
    console.log(a); // iterate over values from all arrays
}

上面没有创建新数组。操作符concat将遍历原始数组,然后按照指定的顺序自动继续到array2、array3等等。

就内存使用而言,这是最有效的连接数组的方法。

如果在最后,你决定将它转换为一个实际的物理数组,你可以通过展开操作符或array .from来实现:

const fullArray1 = [...i]; // pulls all values from iterable, into a new array

const fullArray2 = Array.from(i); // does the same