zoukankan      html  css  js  c++  java
  • JS

    方法一:最普遍的做法

    使用 ES5 语法来实现虽然会麻烦些,但兼容性最好,不用考虑浏览器 JavaScript 版本。也不用引入其他第三方库。

    1,直接使用 filter、concat 来计算

    var a = [1,2,3,4,5]
    var b = [2,4,6,8,10]
     
    //交集
    var c = a.filter(function(v){ return b.indexOf(v) > -1 })
     
    //差集
    var d = a.filter(function(v){ return b.indexOf(v) == -1 })
     
    //补集
    var e = a.filter(function(v){ return !(b.indexOf(v) > -1) })
            .concat(b.filter(function(v){ return !(a.indexOf(v) > -1)}))
     
    //并集
    var f = a.concat(b.filter(function(v){ return !(a.indexOf(v) > -1)}));
     
    console.log("数组a:", a);
    console.log("数组b:", b);
    console.log("a与b的交集:", c);
    console.log("a与b的差集:", d);
    console.log("a与b的补集:", e);
    console.log("a与b的并集:", f);
    运行结果如下:
    原文:JS - 计算两个数组的交集、差集、并集、补集(多种实现方式)

    2,对 Array 进行扩展

    (1)为方便使用,我们可以对数组功能进行扩展,增加一些常用的方法。
    //数组功能扩展
    //数组迭代函数
    Array.prototype.each = function(fn){
      fn = fn || Function.K;
       var a = [];
       var args = Array.prototype.slice.call(arguments, 1);
       for(var i = 0; i < this.length; i++){
           var res = fn.apply(this,[this[i],i].concat(args));
           if(res != null) a.push(res);
       }
       return a;
    };
     
    //数组是否包含指定元素
    Array.prototype.contains = function(suArr){
      for(var i = 0; i < this.length; i ++){
          if(this[i] == suArr){
              return true;
          }
       }
       return false;
    }
     
    //不重复元素构成的数组
    Array.prototype.uniquelize = function(){
       var ra = new Array();
       for(var i = 0; i < this.length; i ++){
          if(!ra.contains(this[i])){
              ra.push(this[i]);
          }
       }
       return ra;
    };
     
    //两个数组的交集
    Array.intersect = function(a, b){
       return a.uniquelize().each(function(o){return b.contains(o) ? o : null});
    };
     
    //两个数组的差集
    Array.minus = function(a, b){
       return a.uniquelize().each(function(o){return b.contains(o) ? null : o});
    };
     
    //两个数组的补集
    Array.complement = function(a, b){
       return Array.minus(Array.union(a, b),Array.intersect(a, b));
    };
     
    //两个数组并集
    Array.union = function(a, b){
       return a.concat(b).uniquelize();
    };

    (2)使用样例
    var a = [1,2,3,4,5]
    var b = [2,4,6,8,10]
    console.log("数组a:", a);
    console.log("数组b:", b);
    console.log("a与b的交集:", Array.intersect(a, b));
    console.log("a与b的差集:", Array.minus(a, b));
    console.log("a与b的补集:", Array.complement(a, b));
    console.log("a与b的并集:", Array.union(a, b));

    (3)运行结果同上面一样。
    原文:JS - 计算两个数组的交集、差集、并集、补集(多种实现方式)

    方法二:使用 ES6 语法实现

    1,实现原理

    而在 ES6 中我们可以借助扩展运算符(...)以及 Set 的特性实现相关计算,代码也会更加简单些。

    2,样例代码

    var a = [1,2,3,4,5]
    var b = [2,4,6,8,10]
    console.log("数组a:", a);
    console.log("数组b:", b);
     
    var sa = new Set(a);
    var sb = new Set(b);
     
    // 交集
    let intersect = a.filter(x => sb.has(x));
     
    // 差集
    let minus = a.filter(x => !sb.has(x));
     
    // 补集
    let complement  = [...a.filter(x => !sb.has(x)), ...b.filter(x => !sa.has(x))];
     
    // 并集
    let unionSet = Array.from(new Set([...a, ...b]));
     
    console.log("a与b的交集:", intersect);
    console.log("a与b的差集:", minus);
    console.log("a与b的补集:", complement);
    console.log("a与b的并集:", unionSet);
    运行结果还是一样:
    原文:JS - 计算两个数组的交集、差集、并集、补集(多种实现方式)

    方法三:使用 jQuery 实现

    如果项目中有引入 jQuery,那么实现起来也很简单。
    var a = [1,2,3,4,5]
    var b = [2,4,6,8,10]
    console.log("数组a:", a);
    console.log("数组b:", b);
     
    // 交集
    let intersect = $(a).filter(b).toArray();
     
    // 差集
    let minus = $(a).not(b).toArray();
     
    // 补集
    let complement  = $(a).not(b).toArray().concat($(b).not(a).toArray());
     
    // 并集
    let unionSet = $.unique(a.concat(b));
     
    console.log("a与b的交集:", intersect);
    console.log("a与b的差集:", minus);
    console.log("a与b的补集:", complement);
    console.log("a与b的并集:", unionSet);
    运行结果还是一样:
    原文:JS - 计算两个数组的交集、差集、并集、补集(多种实现方式)
     
     
     
     
     
     
    http://m.hangge.com/news/cache/detail_1862.html
  • 相关阅读:
    剑指Offer-30.连续子数组的最大和(C++/Java)
    剑指Offer-29.最小的K个数(C++/Java)
    UVA 1616 Caravan Robbers 商队抢劫者(二分)
    UVA 10570 Meeting with Aliens 外星人聚会
    UVA 11093 Just Finish it up 环形跑道 (贪心)
    UVA 12673 Erratic Expansion 奇怪的气球膨胀 (递推)
    UVA 10954 Add All 全部相加 (Huffman编码)
    UVA 714 Copying Books 抄书 (二分)
    UVALive 3523 Knights of the Round Table 圆桌骑士 (无向图点双连通分量)
    codeforecs Gym 100286B Blind Walk
  • 原文地址:https://www.cnblogs.com/xuey/p/11448762.html
Copyright © 2011-2022 走看看