說這個話題之前,我們來講一下C#的linq 語法。在C#里面我們會對列表進行操作,如OrderBy(p=>p.property),Where(p=>p.property==..)
括號里面的就是所謂的lamda表達式。下面我們就來實現對js里面對象數組的類似操作。
先說一下思想:
在代碼中先用一個占位符替代,最后動態的替代占位符express,然后將替代占位符后的函數的字符竄代碼用eval()執行一下,成為一個有效的函數。
代碼如下:

1 var query = function (exp, isAsc) { 2 var isArray = function (queryArr) { 3 return Object.prototype.toString.call(queryArr) == "[object Array]"; 4 }; 5 var whereTemplete = function (queryArr) { 6 var arr = []; 7 if (isArray(queryArr)) { 8 for (var i = 0; i < queryArr.length; i++) { 9 var e = queryArr[i]; 10 if (express) { 11 arr.push(e); 12 } 13 } 14 } 15 return arr; 16 }; 17 var orderTemplete = { 18 orderAscTemplete: function (queryArr) { 19 var temp = {}; 20 var arr = queryArr; 21 if (isArray(arr)) { 22 for (var i = 0; i < arr.length; i++) { 23 for (var k = 0; k < arr.length; k++) { 24 if (arr[i]['express'] < arr[k]['express']) { 25 temp = arr[i] 26 arr[i] = arr[k]; 27 arr[k] = temp; 28 } 29 } 30 } 31 } 32 return arr; 33 }, 34 orderDescTemplete: function (queryArr) { 35 var temp = {}; 36 var arr = queryArr; 37 if (isArray(arr)) { 38 for (var i = 0; i < arr.length; i++) { 39 for (var k = 0; k < arr.length; k++) { 40 if (arr[i]['express'] > arr[k]['express']) { 41 temp = arr[i] 42 arr[i] = arr[k]; 43 arr[k] = temp; 44 } 45 } 46 } 47 } 48 return arr; 49 } 50 }; 51 var hasOper = exp.indexOf('>' | '=' | '<'); 52 var str = hasOper >= 0 53 ? whereTemplete.toString().replace('express', exp) 54 : ( 55 isAsc 56 ? orderTemplete.orderAscTemplete.toString().replace(/express/g, exp.replace('e.', '')) 57 : orderTemplete.orderDescTemplete.toString().replace(/express/g, exp.replace('e.', '')) 58 ); 59 60 return eval('0,' + str); 61 } 62 Array.prototype.Query = function () { 63 var self = this; 64 return arguments.length == 1 65 ? (new query(arguments[0])(self)) 66 : (new query(arguments[0], arguments[1])(self)); 67 }
代碼不難,大家是可以看懂的,慢慢體會一下,沒什么要講解的地方。
唯一的就是大家要對原型要有一定的了解。
然后說一下調用的具體方法:
var arr = [{ name: 'aaa', grade: 90 }, { name: 'ccc', grade: 70 }, { name: 'bbb', grade: 80 }]; //var filterArr = arr.Query("e.grade", false); 實現排序 var filterArr = arr.Query('e.grade>80');//實現過濾 for (var i = 0; i < filterArr.length; i++) { document.writeln(filterArr[i].name); }