擴充你的javascript數組

來源:互聯網
上載者:User

擴充你的javascript數組

現在做的項目用的正是jquery的架構,Jquery miniui,其功能強大、效能卓越、易於上手、不失靈活,在不斷學習和研發的過程中,miniui給了很多的啟發,讓我重新認識了js的本質,意識到了js的強大功能。

使用javascript的時候難免會用到數組操作,進來js的功能越來越強大,使用範圍越來越廣,很多程式設計語言的各種資料結構,本質上都是一樣的,都是把基礎資料型別 (Elementary Data Type)做封裝,形成功能各異,各有特色的對象、數組、集合等等。接下來我們重點討論一下js的數組操作。

先說一下js的map,map本質上使用js的數組和對象相結合而實現的,可以實現存取資料,查詢和刪除,判斷存在與否等等,既然要模仿寫出就應該具備其所有功能。

 

兩個數組的交並補集:

 

/** * each是一個集合迭代函數,它接受一個函數作為參數和一組可選的參數 * 這個迭代函數依次將集合的每一個元素和選擇性參數用函數進行計算,並將計算得的結果集返回 {%example <script> var a = [1,2,3,4].each(function(x){return x > 2 ? x : null}); var b = [1,2,3,4].each(function(x){return x < 0 ? x : null}); alert(a); alert(b); </script> %} * @param {Function} fn 進行迭代判定的函數 * @param more ... 零個或多個可選的使用者自訂參數 * @returns {Array} 結果集,如果沒有結果,返回空集 */ Array.prototype.each = function(fn){ fn = fn || Function.K; var a = []; var args = Array.prototype.slice.call(arguments, 1); for(var i = 0; i < this.length; i++){ var res = fn.apply(this,[this[i],i].concat(args)); if(res != null) a.push(res); } return a; }; /** * 得到一個數組不重複的元素集合 * 唯一化一個數組 * @returns {Array} 由不重複元素構成的數組 */ Array.prototype.uniquelize = function(){ var ra = new Array(); for(var i = 0; i < this.length; i ++){ if(!ra.contains(this[i])){ ra.push(this[i]); } } return ra; }; /** * 求兩個集合的補集 {%example <script> var a = [1,2,3,4]; var b = [3,4,5,6]; alert(Array.complement(a,b)); </script> %} * @param {Array} a 集合A * @param {Array} b 集合B * @returns {Array} 兩個集合的補集 */ Array.complement = function(a, b){ return Array.minus(Array.union(a, b),Array.intersect(a, b)); }; /** * 求兩個集合的交集 {%example <script> var a = [1,2,3,4]; var b = [3,4,5,6]; alert(Array.intersect(a,b)); </script> %} * @param {Array} a 集合A * @param {Array} b 集合B * @returns {Array} 兩個集合的交集 */ Array.intersect = function(a, b){ return a.uniquelize().each(function(o){return b.contains(o) ? o : null}); }; /** * 求兩個集合的差集 {%example <script> var a = [1,2,3,4]; var b = [3,4,5,6]; alert(Array.minus(a,b)); </script> %} * @param {Array} a 集合A * @param {Array} b 集合B * @returns {Array} 兩個集合的差集 */ Array.minus = function(a, b){ return a.uniquelize().each(function(o){return b.contains(o) ? null : o}); }; /** * 求兩個集合的並集 {%example <script> var a = [1,2,3,4]; var b = [3,4,5,6]; alert(Array.union(a,b)); </script> %} * @param {Array} a 集合A * @param {Array} b 集合B * @returns {Array} 兩個集合的並集 */ Array.union = function(a, b){ return a.concat(b).uniquelize(); };

判斷數組是否包含某個元素,可以使用contains,也可以自己定義一個方法,可以靈活來掌握比較的方式,類似於覆蓋了java類中的equals方法,舉例:

 

 

var objArr = [{ name: 張三, age: 24, sex: 男 }, { name: 張二, age: 21, sex: 女 }, { name: 張一, age: 23, sex: 男 }, { name: 張四, age: 25, sex: 女 }, { name: 張五, age: 22, sex: 男}]; Array.prototype.contain=function(obj,props){var equals = true;for(var i = 0;i < this.length;i++){var thisObj = this[i];for(var j = 0;j < props.length;j++){var prop = props[j];equals = obj[prop] == thisObj[prop]?true:false;if(!equals){break;}}if(equals){break;}}return equals;}
如何判斷一個對象是否存在於數組中呢?我們擴充了contain方法,第一個參數是被查詢的對象,第二參數是比較的內容(屬性數組),比如:要求對象的name和age屬性一直的時候就判斷其相等:

 

 

var obj = {name: 張五, age: 22, sex: 男};var props = [age,name];alert(objArr.contain(obj,props));

可以看到,alert返回的是true。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.