JS計(jì)算兩個(gè)數(shù)組的交集帅矗、差集偎肃、并集、補(bǔ)集(多種實(shí)現(xiàn)方式)

方法一:最普遍的做法

使用 ES5 語(yǔ)法來(lái)實(shí)現(xiàn)雖然會(huì)麻煩些浑此,但兼容性最好累颂,不用考慮瀏覽器 JavaScript 版本。也不用引入其他第三方庫(kù)凛俱。

1紊馏,直接使用 filter、concat 來(lái)計(jì)算

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 })

//補(bǔ)集
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的補(bǔ)集:", e);
console.log("a與b的并集:", f);

2最冰,對(duì) Array 進(jìn)行擴(kuò)展

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

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

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

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

//兩個(gè)數(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的補(bǔ)集:", Array.complement(a, b));
console.log("a與b的并集:", Array.union(a, b));

方法二:使用 ES6 語(yǔ)法實(shí)現(xiàn)

1瘦棋,實(shí)現(xiàn)原理

而在 ES6 中我們可以借助擴(kuò)展運(yùn)算符(...)以及 Set 的特性實(shí)現(xiàn)相關(guān)計(jì)算,代碼也會(huì)更加簡(jiǎ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));
 
 // 補(bǔ)集
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的補(bǔ)集:", complement);
console.log("a與b的并集:", unionSet);

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

如果項(xiàng)目中有引入 jQuery,那么實(shí)現(xiàn)起來(lái)也很簡(jiǎ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();

// 補(bǔ)集
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的補(bǔ)集:", complement);
console.log("a與b的并集:", unionSet);
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末沛慢,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子达布,更是在濱河造成了極大的恐慌团甲,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,682評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件黍聂,死亡現(xiàn)場(chǎng)離奇詭異躺苦,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)产还,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)匹厘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人脐区,你說(shuō)我怎么就攤上這事愈诚。” “怎么了牛隅?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,083評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵炕柔,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我媒佣,道長(zhǎng)匕累,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,763評(píng)論 1 295
  • 正文 為了忘掉前任默伍,我火速辦了婚禮哩罪,結(jié)果婚禮上授霸,老公的妹妹穿的比我還像新娘。我一直安慰自己际插,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,785評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布显设。 她就那樣靜靜地躺著框弛,像睡著了一般。 火紅的嫁衣襯著肌膚如雪捕捂。 梳的紋絲不亂的頭發(fā)上瑟枫,一...
    開(kāi)封第一講書(shū)人閱讀 51,624評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音指攒,去河邊找鬼慷妙。 笑死,一個(gè)胖子當(dāng)著我的面吹牛允悦,可吹牛的內(nèi)容都是我干的膝擂。 我是一名探鬼主播,決...
    沈念sama閱讀 40,358評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼隙弛,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼架馋!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起全闷,我...
    開(kāi)封第一講書(shū)人閱讀 39,261評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤叉寂,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后总珠,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體屏鳍,經(jīng)...
    沈念sama閱讀 45,722評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年局服,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了钓瞭。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,030評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡腌逢,死狀恐怖降淮,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情搏讶,我是刑警寧澤佳鳖,帶...
    沈念sama閱讀 35,737評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站媒惕,受9級(jí)特大地震影響系吩,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜妒蔚,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,360評(píng)論 3 330
  • 文/蒙蒙 一穿挨、第九天 我趴在偏房一處隱蔽的房頂上張望月弛。 院中可真熱鬧,春花似錦科盛、人聲如沸帽衙。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,941評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)厉萝。三九已至,卻和暖如春榨崩,著一層夾襖步出監(jiān)牢的瞬間谴垫,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,057評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工母蛛, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留翩剪,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,237評(píng)論 3 371
  • 正文 我出身青樓彩郊,卻偏偏與公主長(zhǎng)得像前弯,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子焦辅,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,976評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • PNG 有PNG8和truecolor PNG PNG8類(lèi)似GIF顏色上限為256博杖,文件小,支持alpha透明度筷登,...
    hudaren閱讀 1,524評(píng)論 0 0
  • 本文為原創(chuàng)剃根,作者為Mozilla Web、Jason Orendorff前方,譯者為L(zhǎng)enville狈醉。未經(jīng)許可,拒絕任...
    尾尾閱讀 4,985評(píng)論 1 20
  • 面試題一:https://github.com/jimuyouyou/node-interview-questio...
    R_X閱讀 1,623評(píng)論 0 5
  • 函數(shù)和對(duì)象 1惠险、函數(shù) 1.1 函數(shù)概述 函數(shù)對(duì)于任何一門(mén)語(yǔ)言來(lái)說(shuō)都是核心的概念苗傅。通過(guò)函數(shù)可以封裝任意多條語(yǔ)句,而且...
    道無(wú)虛閱讀 4,566評(píng)論 0 5
  • 前面的話 ES5中包含5種原始類(lèi)型:字符串班巩、數(shù)字渣慕、布爾值、null和undefined抱慌。ES6引入了第6種原始類(lèi)型...
    CodeMT閱讀 688評(píng)論 0 1