使用不同的方法合并/合并两个JS数组

这是Javascript数组中使用的一些技术的简单文章,我们将使用不同的方法来合并/合并两个JS数组,并讨论每个方法的优点和缺点。

让我们考虑以下内容:

复制代码代码如下所示:

var = { 1, 2, 3,4, 5, 6,7, 8, 9 };

var



很显然,最简单的组合应该是:

复制代码代码如下所示:

{

1, 2, 3,4, 5, 6,7, 8, 9,



}



Concat(..)

这是最常见的做法。

复制代码代码如下所示:

var c = a.concat(B);

一; / / { 1,2,3,4,5,6,7,8,9 }

b

C; / / { 1,2,3,4,5,6,7,8,9,foo

正如你所看到的,C是一个新的数组,它代表了A和B两个数组的组合,保持A和B不变。

但是如果A有10000个元素,而B有一万个元素C将有2万个元素,因此A和B的内存使用将加倍。

没关系。你说。让它们被垃圾收集,A和B被设为null,问题就解决了!

A = B = null; / / 'a'and'b的恢复

哈哈 u3002this不是只有几个小数组元素的问题。但有许多大型阵列的改进,或在系统内存有限,需要经常重复的。

循环插入

好吧,让我们复制到另一个数组,使用数组内容:#推(..)

复制代码代码如下所示:

在上

对于(var i = 0;i < b.length;i++){

A.push(B {我});

}

一; / / { 1,2,3,4,5,6,7,8,9,foo

b = null;

现在,数组A具有数组B的内容。

似乎有更好的内存占用。

但是如果数组较小呢内存和速度,你可以把小的没问题面前,只是改变推(..)到位置(..):

复制代码代码如下所示:

进入B:

对于(var i = a.length-1;我> = 0;我--){

B.unshift(一个{我});

}

B; / / { 1,2,3,4,5,6,7,8,9,foo



功能性技能

但是for循环真的很难看,维护得不好,我们能做得更好吗

这是我们的第一次尝试,使用阵列#减少:

复制代码代码如下所示:

在上:

a b.reduce(功能(Coll,项){

Coll.push(项);

返回学院;

};



一; / / { 1,2,3,4,5,6,7,8,9,foo



到:

B = a.reduceright(功能(Coll,项){

Coll.unshift(项);

返回学院;

},b);



B; / / { 1,2,3,4,5,6,7,8,9,foo



阵列#减少(..)和阵列# reduceright(..)是好的,但他们有一点笨拙。ES6 = >箭头功能会减少代码量,但它仍然需要一个功能,每一种需要被调用一次,不完美。

这个怎么样:

复制代码代码如下所示:

在上:



A.push.apply(A,B);



一; / / { 1,2,3,4,5,6,7,8,9,foo



到:



B.unshift.apply(B,A);



B; / / { 1,2,3,4,5,6,7,8,9,foo



这是更好的吗特别是因为Unshift(..)方法不需要担心以前的反序这里。ES6的速度运行将更美丽:a.push(…(B)或b.unshift…一)

数组的最大长度限制

第一个主要问题是内存使用量增加了一倍(当然只是暂时的!)添加的内容基本上是通过函数调用复制到堆栈中的,此外,不同的js引擎也有拷贝数据长度的限制。

所以,如果数组有一百万个元素,你将超越极限(…)或位置(…)允许调用堆栈,将成千上万的元素做的不错,但是你要小心不要超过合理的长度限制。

注意:你可以试试拼接(…),具有相同的问题推(…)和位置(…)。

有一种方法可以避免这个最大长度限制。

复制代码代码如下所示:

功能combineinto(A,B){

VaR len = a.length;

对于(var i = 0;i <;i = i + 5000){

B.unshift.apply(B,a.slice(I,I + 5000));

}

}

等一下,我们的可读性退了,就是这样,也许更糟,哦。