zoukankan      html  css  js  c++  java
  • 一些简单的帮助类(2)-- JavaSctipt Array Linq

    在日程工作中经常会遇到这样的问题 一个JS数组 我们要找出其中 一些符合要求的类容

    又或者对数组里的类容求和求平均数之类的一般的做法是循环里面的类容做判断添加到一个新的集合里

      var array = [];
      array.push(1);
      array.push(2);
      array.push(3);
      array.push(4);
      array.push(5);
      array.push(6);
    
      var whereArray = [];
      for(var model in array)
      {
        if(model<3) 
        {
            whereArray.push(model);
        }
     }    

    如果需要做查询的代码多了我们就不得不写非常多的循环

    回想下C#里的List集合和Array也差不多 但是System.Linq.Enumerable 扩展类 却给了他非常多的Linq 扩展方法

    使们我们能像如下代码这样查询List

            List<int> list = new List<int>();
            a.Add(1);
            a.Add(2);
            a.Add(3);
            a.Add(4);
            a.Add(5);
            a.Add(6);
             List<int> copyList = list.Where(model => model < 3);    

    拿JavaSctipt 能不能做出一个跟System.Linq.Enumerable 差不多一样的扩展类来了答案是能的我们来定义一段如下的JavaScript脚本

                 Array.prototype.Where = function (func) {
                        var copy = [];
                        for (var model in this) {
                            try {
                                if (func(model)) {
                                    copy.push(model);
                                }
                            }
                            catch (ex) { }
                        }
                    }    

    把它放在页面顶部我们会惊喜的发现 Array 多了一个Where方法 Javascript 每个类的方法都会在prototype中向他添加一个方法也就是向内中添加了一个方法

    我们来调用试下

                   var array = [1,2,3,4,5,6];
                    var copyArray = array.Where(function (model) {return model < 1;})    

    我们会发现这段代码得到了和第一段代码相同的效果但代码却要减少不少

    这样我们就可以吧 其他System.Linq.Enumerable里的常用方法挨个定义出来

                    (function () {
                        /*
                        筛选符合要求的元素
                        func: (e)=>{return bool}
                        return Array
                        */
                        Array.prototype.Where = function (func) {
                            var copy = [];
                            for (var model in this) {
                                try {
                                    if (func(model)) {
                                        copy.push(model);
                                    }
                                }
                                catch (ex) { }
                            }
                        }
                        /*
                        求和
                        func: (e)=>{return Number}
                        return Number
                        */
                        Array.prototype.Sum = function (func) {
                            
                            var int = 0;
                            for (var model in this) {
                                try {
                                    var NaN = func(model);
                                    if (isNaN(NaN)) {
                                        a += NaN * 1;
                                    }
                                }
                                catch (ex) { }
                            }
                            return int;
                        }
                        /*
                        获取集合里第一个符合要求的元素
                        func: (e)=>{return bool}
                        return e or NULL
                        */
                        Array.prototype.Find = function (func) {
                            for (var model in this) {
                                try {
                                    if (func(model)) {
                                        return model;
                                    }
                                }
                                catch (ex) { }
                            }
                            return null
                        }
                    })(Array)

    定义好后每次 使用就直接把存放这段JS的文件拖到页面上 每次就都能使用这些扩展方法了

    还有一点就是JavaSctipt 里的方法注释是这样的/**/ 而不是//

    区别就是在VS IDE里能有 提示

    技术交流群NET技术交流

  • 相关阅读:
    caffe常用层: batchNorm层和scale层
    简述configure、pkg-config、pkg_config_path三者的关系
    python删除list中元素的三种方法
    Leetcode 872. Leaf-Similar Trees
    Leetcode 508. Most Frequent Subtree Sum
    Leetcode 572. Subtree of Another Tree
    Leetcode 894. All Possible Full Binary Trees
    Leetcode 814. Binary Tree Pruning
    Leetcode 557. Reverse Words in a String III
    python 多维list声明时的小问题
  • 原文地址:https://www.cnblogs.com/ab12/p/3751943.html
Copyright © 2011-2022 走看看