说这个话题之前,我们来讲一下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); }