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 }