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 }