• 来个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);
            }
  • 相关阅读:
    十天冲刺开发第六天个人工作总结
    十天冲刺开发第五天个人工作总结
    人月神话阅读笔记1
    第六周进度条
    构建之法阅读笔记6
    连通数组的最大子数组和
    团队项目成员和题目
    第五周进度条
    四则运算———安卓版
    构建执法阅读笔记5
  • 原文地址:https://www.cnblogs.com/a546558309/p/3476950.html
Copyright © 2020-2023  润新知