WithCoderWithCoderWithCoder

Javascrip合并数组的几种方法

在使用Javascript数组的时,经常会需要将两个或多个数组合并成一个数组.本文就常用的几种合并方法通过示例代码,进行简单的讲解.个人备忘,也希望对大家的学习或者工作具有一定的参考价值.

假设有2个数组

    var a = [1,2,3];

    var b = [4,5,6];   

将上面两个数组合并成一个,本人第一个想法是用a.push(b),但返回的结果是[1,2,3,array(3)].这样合并方法是有问题的,push方法的参数是一个或多个值,这样合并的是b数组本身,而不是b数组中的元素.经过网络搜索整理,用到的方法如下:

1. concat

    js的Array对象的concat()方法.array.concat(value,...),此方法的参数为任意个要衔接到array中的值(值可以是单个值或者数组,如果是数组,concat会将合并数组的元素而不是数组本身).

        var c = a.concat(b); // c=[1,2,3,4,5,6];   

    这里要注意,concat方法返回一个新数组(原来的a数组和b数组没有发生变化),包含a数组中的元素,以及衔接的b数组中的元素.这样当我们需要进行多次的数组合并时,会造成很大的内存浪费.如果是数据量比较小的时候,影响不大.如果数据量大的时候,这个方法就不是最好的.

2. for循环

    这个可能是我们经常会用的方法,只用遍历其中一个数组,把该数组中的所有元素依次添加到另外一个数组中.具体做法如下:

        for( var i in b) {

            a.push(b[i]);

        }   

3. apply

    函数的apply方法有一个特性,那就是func.apply(obj,args),args是一个数组.所以我们可以利用这点,将数组附加到obj对象上.具体如:
        a.push.apply(a,b);

    调用a.push这个函数实例的apply方法,同时把b数组当作参数传入,这样a.push这个方法就会遍历b数组的所有元素,达到合并的效果.需要注意的是:

    1. 这种方式会修改数组a;

    2. 当对一个方法传入非常多的参数(比如10000个)时,很可能会导致越界问题.

使用以上方法,还要注意两个小问题:

    1. 以上3种合并方法并没有考虑过a、b两个数组谁的长度更小,所以好的做法是预先判断a、b两个数组哪个更大,然后使用大数组合并小数组,这样就减少了数组元素操作的次数.

    2. 有时候我们不希望原数组(a、b)改变,这时就只能使用concat了.

欢迎分享交流,转载请注明出处:WithCoder » Javascrip合并数组的几种方法