当前位置: 首页 > 科技观察

说说JavaScript数组合并的几种常用方法

时间:2023-03-20 11:51:52 科技观察

这是一篇简单的文章,介绍了JavaScript数组的一些使用技巧。我们将使用不同的方法组合/合并两个JS数组,并讨论每种方法的优点/缺点。让我们首先考虑以下情况:vara=[1,2,3,4,5,6,7,8,9];varb=["foo","bar","baz","bam","bun","fun"];显然最简单的组合应该是:[1,2,3,4,5,6,7,8,9,"foo","bar","baz","bam""bun","fun"]concat(..)这是最常见的方式:varc=a.concat(b);a;//[1,2,3,4,5,6,7,8,9]b;//["foo","bar","baz","bam","bun","fun"]c;//[1,2,3,4,5,6,7,8,9,"foo","bar","baz","bam","bun","fun"]如您所见,C是一个全新的数组,代表a和b两个数组的组合,A和B不变。简单吧?但是如果a有10,000个元素而b有10,000个呢?C将有20,000个元素,因此a和b的内部内存使用量将增加一倍。“没问题!”,你说。让它们被垃圾回收,将A和B设置为null,问题解决了!a=b=空;//'a'和'b'被回收了哈哈。对于只有少数元素的小型数组,这很好。但是对于大数组,或者在内存有限的系统中需要频繁重复这个过程,其实还有很大的提升空间。循环插入好吧,让我们将一个数组的内容复制到另一个数组,使用:Array#push(..)//`b`到`a`for(vari=0;i=0;i--){b.unshift(a[i]);}b;//[1,2,3,4,5,6,7,8,9,"foo","bar","baz","bam","bun","fun"]函数式技巧但是对于loop真的很丑,而且不容易维护。我们能做得更好吗?这是我们的第一次尝试,使用Array#reduce://`b`到`a`上:a=b.reduce(function(coll,item){coll.push(item);returncoll;},a);a;//[1,2,3,4,5,6,7,8,9,"foo","bar","baz","bam","bun","fun"]//或`a`进入`b`:b=a.reduceRight(function(coll,item){coll.unshift(item);returncoll;},b);b;//[1,2,3,4,5,6,7,8,9,"foo","bar","baz","bam","bun","fun"]Array#reduce(..)和Array#reduceRight(..)很好,但它们有点笨拙。ES6=>的箭头函数会减少代码量,但是还是需要一个函数,每个元素都需要调用一次,效率不是很高。这个怎么样://`b`放到`a`上:a.push.apply(a,b);a;//[1,2,3,4,5,6,7,8,9,"foo","bar","baz","bam","bun","fun"]//或`a`进入`b`:b.unshift.apply(b,a);b;//[1,2,3,4,5,6,7,8,9,"foo","bar","baz","bam","bun","fun"]这样好多了,正确的?特别是因为unshift(..)方法在这里不需要担心前面的反向排序。ES6的极速运行会更漂亮:a.push(...b)orb.unshift(...aarray***lengthlimit***主要问题是内存占用翻倍(当然只是暂时的!)基本上是通过函数调用将元素复制到栈中。另外,不同的JS引擎对复制数据的长度有限制。所以,如果数组有百万个元素,你肯定会超过push(...)或unshift(…)允许调用堆栈的限制。唉,它会很好地处理几千个元素,但你必须注意不要超过合理的长度限制。注意:你可以尝试splice(…),它和push(…)和unshift(…)有同样的问题。有一种方法可以避免这个***长度限制。functioncombineInto(a,b){varlen=a.length;for(vari=0;i