这篇文章属于Javascript的基本技巧。我们将学习各种常用的方法来合并/合并两个JS数组,并比较各种方法的优缺点。

让我们先看看特定的场景。

复制代码代码如下所示:

q={ 5, 5, 1,9, 9, 6,4, 5, 8 };

var



显然,阵列q和b的简单拼接的结果是:

复制代码代码如下所示:

{

5, 5, 1,9, 9, 6,4, 5, 8,

领带

}



Concat(..)方法

最常见的用途如下:

复制代码代码如下所示:

var c = q.concat(B);

Q; / / { 5,5,1,9,9,6,4,5,8 }

b

C; / / 领带{ 5,5,1,9,9,6,4,5,8,



如你所见,C是一个新的数组,它代表了Q和B两个数组的组合,但是Q和B现在不使用了。

如果q数组有10000个元素,而B数组有10000个元素,那么数组C现在有20000个元素,它占用内存的2倍。

没问题!你可能会想。只剩下Q和B空,然后被垃圾收集,并解决问题!

复制代码代码如下所示:

q =空。



如果数组的数量很小,这是很自然的。但对于大型数组,或者当需要重复多次时,内存受到限制,需要进行优化。

循环插入

好吧,让我们尝试添加数组的内容,使用数组#推()方法:

复制代码代码如下所示:

将数组中的

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

Q.push(B {我});

}

Q; / / 领带{ 5,5,1,9,9,6,4,5,8,

b = null;



现在,两个原始数组(Q + B)的内容存储在Q中。

这看起来是一个很好的内存优化。

但如果Q阵是小B大,考虑内存和速度的考虑,然后我们想插入小Q到没问题前,只要不位移()方法是用来代替推(),相应的也应该从大到小。

复制代码代码如下所示:

进入B:

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

B.unshift(Q {我});

}

B; / / 领带{ 5,5,1,9,9,6,4,5,8,

q = null;



实用技巧

可悲的是,周期很土,很难维护。我们能做得更好吗

让我们试着减少阵列#第一:

复制代码代码如下所示:

添加到:

Q = b.reduce(功能(Coll,项){

Coll.push(项);

返回学院;

},q);

Q; / / 领带{ 5,5,1,9,9,6,4,5,8,

到:

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

Coll.unshift(项);

返回学院;

},b);

B; / / 领带{ 5,5,1,9,9,6,4,5,8,



(数组#减少)和阵列# reduceright()很高,但有点重,但大多数人都不记得了。在箭头函数规范(箭头函数)中可以显着减少代码数量,但需要执行每个数组元素的函数调用,意味着是渣。(6)。

那么下面的代码呢

复制代码代码如下所示:

添加到:

Q.push.apply(Q,B);

Q; / / 领带{ 5,5,1,9,9,6,4,5,8,

到:

B.unshift.apply(B,Q);

B; / / 领带{ 5,5,1,9,9,6,4,5,8,



大是高,对不对尤其是unshift()方法不需要考虑反序之前。6膨胀算子(扩散算子,加…前缀)是更高端的:a.push(…(B)或b.unshift…一)。

但事实上,这种做法过于乐观。在这两种情况下,a或b将作为第二个参数传递给应用程序()(应用函数在上下文、上下文、范围内称为第一个参数),或者使用扩展操作符,…事实上,数组将被分解为参数函数。

第一个问题是它占用内存的两倍(当然,它是暂时的!)因为它需要将数组复制到函数堆栈中。此外,不同的js引擎有不同的实现算法,这可能限制函数可以通过的参数的数量。

如果数组添加一百万个元素,它将超过栈的功能允许的大小,无论是推()或()调用位置。只有在成千上万个元素可用时才可以使用这种方式,因此我们必须将其限制在一定范围内。

注意:你也可以尝试剪接(),你一定会发现,他是把同样的(..)/位置(..)。

一种选择是继续使用此方法,但使用批处理过程:

复制代码代码如下所示:

功能combineinto(Q,B){

VaR len = q.length;

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

5000

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

}

}



等等,我们已经破坏了代码的可读性(甚至是性能!)让我们在放弃之前结束旅程。

总结

阵列# concat()是一个久经考验的方法相结合的两个(或多个)阵列。但他创建了一个新数组,而不是现有数组中的一个数组。

变化技术很多,但都有各自的优缺点,需要根据实际情况进行选择。

有各种各样的优点/缺点上面,也许最好的(包括没有上市)的方法是减少(..)和reduceright(..)

无论你选择什么,你都应该对你的数组合并策略进行批判性的思考,而不是理所当然地去考虑它。