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 }