数码资讯
JS组合数组的几种方法及其优缺点
选购提示
关注价格、性能、续航、售后和真实使用场景,理性比较后再下单。
这篇文章属于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(..)
无论你选择什么,你都应该对你的数组合并策略进行批判性的思考,而不是理所当然地去考虑它。
让我们先看看特定的场景。
复制代码代码如下所示:
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(..)
无论你选择什么,你都应该对你的数组合并策略进行批判性的思考,而不是理所当然地去考虑它。
声明:本文内容用于数码产品信息整理与选购参考,具体价格、库存、售后政策以官方渠道和电商页面实时信息为准。