首页 > 代码库 > 一些简单的帮助类(2)-- JavaSctipt Array Linq

一些简单的帮助类(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里能有 提示