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

 

posted @ 2017-10-10 16:24  丶会飞的羊  阅读(4035)  评论(0编辑  收藏  举报