来个linq to js

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

代码不难,大家是可以看懂的,慢慢体会一下,没什么要讲解的地方。

唯一的就是大家要对原型要有一定的了解。

 

然后说一下调用的具体方法:

     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);
        }

 

 

 

 

posted @ 2013-12-16 16:15  kevinzw  阅读(2005)  评论(3编辑  收藏  举报