JS計算兩個數(shù)組的交集、差集、并集、補集(多種實現(xiàn)方式)

方法一:最普遍的做法

使用 ES5 語法來實現(xiàn)雖然會麻煩些,但兼容性最好,不用考慮瀏覽器 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("數(shù)組a:", a);
console.log("數(shù)組b:", b);
console.log("a與b的交集:", c);
console.log("a與b的差集:", d);
console.log("a與b的補集:", e);
console.log("a與b的并集:", f);

2,對 Array 進行擴展

//數(shù)組功能擴展
//數(shù)組迭代函數(shù)
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;
};

//數(shù)組是否包含指定元素
Array.prototype.contains = function(suArr){
  for(var i = 0; i < this.length; i ++){
      if(this[i] == suArr){
          return true;
      }
   }
   return false;
}

//不重復(fù)元素構(gòu)成的數(shù)組
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;
};

//兩個數(shù)組的交集
Array.intersect = function(a, b){
   return a.uniquelize().each(function(o){return b.contains(o) ? o : null});
};

//兩個數(shù)組的差集
Array.minus = function(a, b){
   return a.uniquelize().each(function(o){return b.contains(o) ? null : o});
};

//兩個數(shù)組的補集
Array.complement = function(a, b){
   return Array.minus(Array.union(a, b),Array.intersect(a, b));
};

//兩個數(shù)組并集
Array.union = function(a, b){
   return a.concat(b).uniquelize();
};

// 使用樣例
var a = [1,2,3,4,5]
var b = [2,4,6,8,10]
console.log("數(shù)組a:", a);
console.log("數(shù)組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));

方法二:使用 ES6 語法實現(xiàn)

1,實現(xiàn)原理

而在 ES6 中我們可以借助擴展運算符(...)以及 Set 的特性實現(xiàn)相關(guān)計算,代碼也會更加簡單些。

2,樣例代碼

var a = [1,2,3,4,5]
var b = [2,4,6,8,10]
console.log("數(shù)組a:", a);
console.log("數(shù)組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);

方法三:使用 jQuery 實現(xiàn)

如果項目中有引入 jQuery,那么實現(xiàn)起來也很簡單。

var a = [1,2,3,4,5]
var b = [2,4,6,8,10]
console.log("數(shù)組a:", a);
console.log("數(shù)組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);
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • PNG 有PNG8和truecolor PNG PNG8類似GIF顏色上限為256,文件小,支持alpha透明度,...
    hudaren閱讀 1,829評論 0 0
  • 本文為原創(chuàng),作者為Mozilla Web、Jason Orendorff,譯者為Lenville。未經(jīng)許可,拒絕任...
    尾尾閱讀 5,052評論 1 20
  • 面試題一:https://github.com/jimuyouyou/node-interview-questio...
    R_X閱讀 1,753評論 0 5
  • 函數(shù)和對象 1、函數(shù) 1.1 函數(shù)概述 函數(shù)對于任何一門語言來說都是核心的概念。通過函數(shù)可以封裝任意多條語句,而且...
    道無虛閱讀 4,943評論 0 5
  • 前面的話 ES5中包含5種原始類型:字符串、數(shù)字、布爾值、null和undefined。ES6引入了第6種原始類型...
    CodeMT閱讀 732評論 0 1

友情鏈接更多精彩內(nèi)容