【JS】兩個數組的交集、差集、並集、補集、去重


 1 /**  
 2 * 得到一個數組不重復的元素集合<br/>  
 3 * 唯一化一個數組  
 4 * @returns {Array} 由不重復元素構成的數組  
 5 */  
 6 Array.prototype.uniquelize = function(){  
 7      var ra = new Array();  
 8      for(var i = 0; i < this.length; i ++){  
 9          if(!ra.contains(this[i])){  
10             ra.push(this[i]);  
11          }  
12      }  
13      return ra;  
14 };
15 
16 /**  
17 * each是一個集合迭代函數,它接受一個函數作為參數和一組可選的參數  
18 * 這個迭代函數依次將集合的每一個元素和可選參數用函數進行計算,並將計算得的結果集返回   
19 * @param {Function} fn 進行迭代判定的函數  
20 * @param more ... 零個或多個可選的用戶自定義參數  
21 * @returns {Array} 結果集,如果沒有結果,返回空集  
22 */  
23 Array.prototype.each = function(fn){  
24     fn = fn || Function.K;  
25      var a = [];  
26      var args = Array.prototype.slice.call(arguments, 1);  
27      for(var i = 0; i < this.length; i++){  
28          var res = fn.apply(this,[this[i],i].concat(args));  
29          if(res != null) a.push(res);  
30      }  
31      return a;  
32 }; 
33 
34 /**
35  * 兩個集合的差集
36 * @param {Array} a 集合A  
37 * @param {Array} b 集合B  
38 * @returns {Array} 兩個集合的差集  
39 */  
40 Array.minus = function(a, b){  
41      return a.uniquelize().each(function(o){return b.contains(o) ? null : o});  
42 };
43 
44 /**  
45 * 求兩個集合的並集   
46 * @param {Array} a 集合A  
47 * @param {Array} b 集合B  
48 * @returns {Array} 兩個集合的並集  
49 */  
50 Array.union = function(a, b){  
51      return a.concat(b).uniquelize();  
52 }; 
53 
54 /**  
55 * 求兩個集合的差集  
56 * @param {Array} a 集合A  
57 * @param {Array} b 集合B  
58 * @returns {Array} 兩個集合的差集  
59 */  
60 Array.minus = function(a, b){  
61      return a.uniquelize().each(function(o){return b.contains(o) ? null : o});  
62 }; 
63 
64 /**  
65 * 求兩個集合的交集   
66 * @param {Array} a 集合A  
67 * @param {Array} b 集合B  
68 * @returns {Array} 兩個集合的交集  
69 */  
70 Array.intersect = function(a, b){  
71      return a.uniquelize().each(function(o){return b.contains(o) ? o : null});  
72 }; 
73 
74 /**  
75 * 求兩個集合的補集   
76 * @param {Array} a 集合A  
77 * @param {Array} b 集合B  
78 * @returns {Array} 兩個集合的補集  
79 */  
80 Array.complement = function(a, b){  
81      return Array.minus(Array.union(a, b),Array.intersect(a, b));  
82 };
83 
84 /**
85  * Array擴展包含函數
86  */
87 Array.prototype.contains = function (obj) {  
88     var i = this.length;  
89     while (i--) {  
90         if (this[i] === obj) {  
91             return true;  
92         }  
93     }  
94     return false;  
95 }  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM