使用不同的方法合并/合并两个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));
}
}
等一下,我们的可读性退了,就是这样,也许更糟,哦。