JS系列——Linq to js使用小結


前言:前面幾篇介紹了下C#基礎技術中的幾個:反射特性泛型序列化擴展方法Linq to Xml等,本來還有兩三個知識點沒有寫完,比如委托、多線程、異步等,后面會陸續將它們補起來,以便作為一套完整的系列。之所以有這篇是因為目前BS項目中前端經常需要對Json的數組對象進行篩選、查找、判斷是否存在等操作。這時就想到了好用的Linq。博主幾年前用過Linq to js,那個時候還覺得那樣寫很別扭,於是沒有重視。現在隨着前段業務的越來越復雜,對前端的數據處理要求也越來越高,使用一種快捷的集合操作方式就變得越來越必要。今天正好趁系統升級Win 10,所以在此做個小結,以后也可以留着當文檔使用。O(∩_∩)O~

 

1、什么是Linq to js :C# 3.0推出了.Net獨有的新特性:Linq。自從有了Linq,程序員再也不用擔心對集合的操作了。同理,Linq to js 當然也就是對前端集合變量進行操作的一種技術框架。

 

2、怎么使用:因為是前端框架,所以你懂得,只需要引用一個js文件即可。這里還是附上官網地址:http://jslinq.codeplex.com/.這上面有文件和Demo,可以上去看看。使用方式主要有兩種:使用方法一、直接引用js文件;使用方法二、使用Nuget Package 安裝Linq to js。在PM安裝控制台中輸入Install-Package jslinq。

本篇以Linq to js的lamada表達式寫法的方式來以此介紹常用方法。我們從官網上面下載下載的文件如下圖

我們只需要引用linq.js文件即可。

(1)條件查詢:Where

var myList = [
            { Name: "Jim", Age: 20 },
            { Name: "Kate", Age: 21 },
            { Name: "Lilei", Age: 18 },
            { Name: "John", Age: 14 },
            { Name: "LinTao", Age: 25 }
    ];
    var arrRes = Enumerable.From(myList).Where("x=>x.Name=='Jim'").ToArray();

arrRes的結果為 [{"Name":"Jim","Age":20}]

我們來看看這種寫Lamada表達式的原型:

var arrRes = Enumerable.From(myList).Where(function (i) { return i.Name=='Jim'; });

參數i是對應的集合里面的實體模型,返回類型為bool類型。有沒有和C#里面的擴展函數Where的定義很像:public static IEnumerable<TSource> Where<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate);參數Func<TSource, bool> predicate為匿名委托,需要傳入實體模型TSource,然后返回值為bool類型。其實感覺linq to js的使用就是參照c#里面的定義來的。

 

(2)條件選擇:Select

var myList = [
            { Name: "Jim", Age: 20 },
            { Name: "Kate", Age: 21 },
            { Name: "Lilei", Age: 18 },
            { Name: "John", Age: 14 },
            { Name: "LinTao", Age: 25 }
    ];
    var arrRes = Enumerable.From(myList).Select("x=>x.Age*10").ToArray();

arrRes得到結果 [200,210,180,140,250]

 

(3)排序、去重:OrderBy、Distinct

var myList = [
            { Name: "Jim", Age: 20 },
            { Name: "Kate", Age: 21 },
            { Name: "Lilei", Age: 18 },
            { Name: "John", Age: 14 },
            { Name: "LinTao", Age: 25 }
    ];
    var arrRes = Enumerable.From(myList).OrderBy("x=>x.Age").ToArray();//降序OrderByDescending()

得到的結果會按照Age排序。

var myList = [
            { Name: "Jim", Age: 20 },
            { Name: "Kate", Age: 20 },
            { Name: "Lilei", Age: 20 },
            { Name: "John", Age: 14 },
            { Name: "LinTao", Age: 25 }
    ];
    var arrRes = Enumerable.From(myList).Distinct("x=>x.Age").ToArray();

得到的結果集合的數量為3個:[ { Name: "Jim", Age: 20 }, { Name: "John", Age: 14 }, { Name: "LinTao", Age: 25 }]。

 

(4)遍歷:ForEach

var myList = [
            { Name: "Jim", Age: 20 },
            { Name: "Kate", Age: 20 },
            { Name: "Lilei", Age: 20 },
            { Name: "John", Age: 14 },
            { Name: "LinTao", Age: 25 }
    ];
    Enumerable.From(myList).ForEach(function(value, index){
         document.write("值="+value+",索引="+index);   
 });

很顯然兩個參數:一個是值,另一個是當前索引

 

(5)取唯一對象:First、FirstOrDefault、Last、LastOrDefault、Single、SingleOrDefault

var myList = [
            { Name: "Jim", Age: 20 },
            { Name: "Kate", Age: 20 },
            { Name: "Lilei", Age: 20 },
            { Name: "John", Age: 14 },
            { Name: "LinTao", Age: 25 }
    ];

    var arrRes = Enumerable.From(myList).FirstOrDefault("x=>x.Age>18");

其他幾個用法和這個類似。這個沒什么好說的。

 

(6)Skip、Take

Enumerable.Range(1,10).Skip(5)//結果[6,7,8,9,10]
Enumerable.Range(1,10).Take(5)//結果[1,2,3,4,5]

 

(7)取交集、取差集、合並

var array1 = [1,412,5,3,5,412,7];
var array2 = [20,12,5,5,7,310];
Enumerable.From(array1).Except(array2)
//結果3,412,1
var array1 = [1,412,5,3,5,412,7];
var array2 = [20,12,5,5,7,310];
Enumerable.From(array1).Intersect(array2)
//結果5,7
var array1 = [1,412,5,3,5,412,7];
var array2 = [20,12,5,5,7,310];
Enumerable.From(array1).Union(array2)
//結果是兩個結果集里面所有值,並自動去重

 

  當然還有其他一些不常用的方法。有興趣可以查看文檔。其實linq to js還有一種支持jquery的寫法。如下:

Enumerable.Range(1,10).Where("$%2==0")
//等價於
Enumerable.Range(1,10).Where("x=>x%2==0")

但引用文件的時候需要引用jquery.linq.js這個文件。就是寫法不同,效果完全一樣,選哪一種就是習慣問題了。博主更加傾向lamada方式的寫法,因為和C#用法可以保持一致。

 

  我把網上下載的文檔傳了一份到博客園上面:linq.js_ver2.2.0.2.rar

 


免責聲明!

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



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