zoukankan      html  css  js  c++  java
  • JS取出两个数组的不同或相同元素

    JS合并两个数组的方法

    我们在项目过程中,有时候会遇到需要将两个数组合并成为一个的情况。比如:
        var a = [1,2,3];
        var b = [4,5,6];
    有两个数组a、b,需求是将两个数组合并成一个。方法如下:
    • 1、concat
      js的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,argv),argv是一个数组。所以我们可以利用这点,直接上代码:
        a.push.apply(a,b);

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

    这里可能有点绕,我们可以把b看成[4,5,6],变成这样:

        a.push.apply(a,[4,5,6]);

    然后上面的操作就等同于:

        a.push(4,5,6);

    这样就很清楚了!

      另外,还要注意两个小问题:

      1)以上3种合并方法并没有考虑过a、b两个数组谁的长度更小。

      所以好的做法是预先判断a、b两个数组哪个更大,然后使用大数组合并小数组,这样就减少了数组元素操作的次数!

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

    上面总结了下数组的常用方法,然后数组的去重也就简单易懂了;

    1、取出两个数组的不同元素

    1 getArrDifference(arr1, arr2) {
    2  
    3     return arr1.concat(arr2).filter(function(v, i, arr) {
    4  
    5         return arr.indexOf(v) === arr.lastIndexOf(v);
    6  
    7     });
    8  
    9 },

     eg:ES6语法有更简洁方法可参考


    2、取出两个数组的相同元素

     1 getArrEqual(arr1, arr2) {
     2     let newArr = [];
     3     for (let i = 0; i < arr2.length; i++) {
     4         for (let j = 0; j < arr1.length; j++) {
     5             if(arr1[j] === arr2[i]){
     6                 newArr.push(arr1[j]);
     7             }
     8         }
     9     }
    10     return newArr;
    11 },
  • 相关阅读:
    ASP.NET编程的十大技巧
    C#学习心得(转)
    POJ 1177 Picture (线段树)
    POJ 3067 Japan (树状数组)
    POJ 2828 Buy Tickets (线段树)
    POJ 1195 Mobile phones (二维树状数组)
    HDU 4235 Flowers (线段树)
    POJ 2886 Who Gets the Most Candies? (线段树)
    POJ 2418 Cows (树状数组)
    HDU 4339 Query (线段树)
  • 原文地址:https://www.cnblogs.com/myfate/p/10511661.html
Copyright © 2011-2022 走看看