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

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM