时间:2016.04.19 发布人:ljxin666666
已解决问题
谷歌ljxin666666用户在2016.04.19提交了关于“
摘星J**ascript实现Linq查询方式”的提问,欢迎大家涌跃发表自己的观点。目前共有1个回答,最后更新于2024-10-24T10:20:27。希望大家能够帮助她。
详细问题描述及疑问:期待您的答案,谢了,下次有事儿别忘了找我
!
希望以下的回答,能够帮助你。
第1个回答
用户名:**xien
Linq是.net平台一个重要的技术,全称LanguageIntegratedQuery。通过构建快速查询语句,可快速从**库或集合中筛选**集、以查询**库相同的方式操作内存**。
在
ECMAScript5th以后的版本中,J**a继script实现了有限的有限的Linq查询方式,包括forEach,every,some,filter,map,red问答uceandre**ceRight.首先需要说明,以上这些方法并不是跨浏览器的,对版本有相应的限制。我们知道L得厚损香什念老还状inq的对象需要实现E**merable接口,本篇文章主要介绍使用JS模拟实现C#中的L陈节树集东居体于应资拉inq查询,包括聚集查询、迭复察代查询、条件查询、构建Selector查询器等。J**ascript本质上并不支持类的继承,通过属性的继承可实现类的面向对象的功能,所以这也被认为是面向对象的一种方式,这就意味着可以使用它的属性构建更多面向对象的接口。例如Array,它是继承自Array.prototype。如果更改了Array.prototype,那么基于这个属性继承的数组表钢行成会烟段必然会变化。有了这些依据后开始构建我们的Linq功能。举个例子,JSAPI不支持unio定技根胶事银严n方法,但支持concat方法合并**。Array.prototype.union先来看看一个.NET下晚死革写总陈的简单查询方式varsomeArray=newint[]{1,2,3,4};varotherArray=***.Select(云划井所t=>t*2);在C#下使用查询**时使问财植研慢用的是Select,使用一个Delegate构建查询。在这个例子中,我们使用了t=>t*2是一个Lambda表达式。将这个功能嫁接到JS下,定义一个function(){}JS下的Select查询可以是这样varsomeArray=[1,2,3,4];varo升主收therArray=***.Selec术第名口命t(function(t){returnt*2});然后定义比较(EqualityComparer)、排序(SortComparer)、条件(Predicate始日木血措答采达盟曾)、查询器(Selector)比较纸沉谁学帝今、排序、条件、查询器J**ascriptLinq列查询器Select遍历元素下的每一个元素,调用***.Call方法返回升过念龙周沙望医边与宣**。Arra状机照害y.***.select=Array.***.map||function(selector,context){c校国ontext=context||window;vararr=[];varl=this.length;for(vari=0;i<l;i++)arr.push(***.call(context,this[i],i,this));returnarr;};vararr=[1,2,3,4,5];vardoubled=***.select(function(t){returnt*2});SelectManySelectManyT**eArray.prototype.t**e=function(c){returnthis.slice(0,c);};vararr=[1,2,3,4,5];varres=arr.t**e(2);Skip跳过指定数后返回集合**,使用slice。Array.prototype.skip=function(c){returnthis.slice(c);};vararr=[1,2,3,4,5];varres=arr.skip(2);First返回序列的第一个元素,如果没有元素,可以指定一个默认元素。Array.prototype.first=function(predicate,def){varl=this.length;if(!predicate)returnl?this[0]:def==**ll?**ll:def;for(vari=0;i<l;i++)if(predicate(this[i],i,this))returnthis[i];returndef==**ll?**ll:def;};vararr=[1,2,3,4,5];vart1=arr.first();vart2=arr.first(function(t){returnt>2});vart3=arr.first(function(t){returnt>10},10);//默认值是10Union合并两个集合中的**,使用concat,不合并重复**。Array.prototype.union=function(arr){returnthis.concat(arr).distinct();};vararr1=[1,2,3,4,5];vararr2=[5,6,7,8,9];varres=arr1.union(arr2);Distinct找出不重复的**。当有重复元素是只push一个元素进集合。Array.prototype.distinct=function(comparer){vararr=[];varl=this.length;for(vari=0;i<l;i++){if(!arr.contains(this[i],comparer))arr.push(this[i]);}returnarr;};vararr1=[1,2,2,3,3,4,5,5];varres1=arr.distinct();//[1,2,3,4,5]vararr2=[{Name:"A",Val:1},{Name:"B",Val:1}];varres2=arr2.distinct(function(a,b){returna.Val==b.Val});//返回[{Name:"A",Val:1}]IndexOf查找指定的值第一次出现的位置。Array.prototype.indexOf=Array.prototype.indexOf||function(o,index){varl=this.length;for(vari=Math.max(Math.min(index,l),0)||0;i<l;i++)if(this[i]===o)returni;return-1;};vararr=[1,2,3,4,5];varindex=arr.indexOf(2);//1Remove从集合中移除指定元素。Array.prototype.remove=function(item){vari=this.indexOf(item);if(i!=-1)this.splice(i,1);};vararr=[1,2,3,4,5];arr.remove(2);//[1,3,4,5]OrderByArray.prototype.orderBy=function(selector,comparer){comparer=comparer||DefaultSortComparer;vararr=this.slice(0);varfn=function(a,b){returncomparer(selector(a),selector(b));};arr.thenBy=function(selector,comparer){comparer=comparer||DefaultSortComparer;returnarr.orderBy(DefaultSelector,function(a,b){varres=fn(a,b);returnres===0?comparer(selector(a),selector(b)):res;});};arr.thenByDescending=function(selector,comparer){comparer=comparer||DefaultSortComparer;returnarr.orderBy(DefaultSelector,function(a,b){varres=fn(a,b);returnres===0?-comparer(selector(a),selector(b)):res;});};returnarr.sort(fn);};vararr=[{Name:"A",Val:1},{Name:"a",Val:2},{Name:"B",Val:1},{Name:"C",Val:2}];varres1=arr.orderBy(function(t){returnt.Name});varres2=arr.orderBy(function(t){returnt.Name},function(a,b){if(a.toUpperCase()>b.toUpperCase())return1;if(a.toUpperCase()<b.toUpperCase())return-1;return0;});OrderByDescendingArray.prototype.orderByDescending=function(selector,comparer){comparer=comparer||DefaultSortComparer;returnthis.orderBy(selector,function(a,b){return-comparer(a,b)});};vararr=[{Name:"A",Val:1},{Name:"a",Val:2},{Name:"B",Val:1},{Name:"C",Val:2}];varres=arr.orderByDescending(function(t){returnt.Name});GroupByArray.prototype.groupBy=function(selector,comparer){vargrp=[];varl=this.length;comparer=comparer||DefaultEqualityComparer;selector=selector||DefaultSelector;for(vari=0;i<l;i++){vark=selector(this[i]);varg=grp.first(function(u){returncomparer(u.key,k);});if(!g){g=[];g.key=k;grp.push(g);}g.push(this[i]);}returngrp;};Array.prototype.groupBy=function(selector,comparer){vargrp=[];varl=this.length;comparer=comparer||DefaultEqualityComparer;selector=selector||DefaultSelector;for(vari=0;i<l;i++){vark=selector(this[i]);varg=grp.first(function(u){returncomparer(u.key,k);});if(!g){g=[];g.key=k;grp.push(g);}g.push(this[i]);}returngrp;};J**ascriptLinq聚合MinArray.prototype.min=function(s){s=s||DefaultSelector;varl=this.length;varmin=s(this[0]);while(l-->0)if(s(this[l])<min)min=s(this[l]);returnmin;};vararr1=[1,2,3,4,5,6,7,8];varmin1=arr.min();//1vararr2=[{Name:"A",Val:1},{Name:"B",Val:2}];varmin2=arr2.min(function(t){returnt.Val});//1MaxArray.prototype.max=function(s){s=s||DefaultSelector;varl=this.length;varmax=s(this[0]);while(l-->0)if(s(this[l])>max)max=s(this[l]);returnmax;};vararr1=[1,2,3,4,5,6,7,8];varmax1=arr.max();//8vararr2=[{Name:"A",Val:1},{Name:"B",Val:2}];varmax2=arr2.max(function(t){returnt.Val});//2SumArray.prototype.sum=function(s){s=s||DefaultSelector;varl=this.length;varsum=0;while(l-->0)sum+=s(this[l]);returnsum;};vararr1=[1,2,3,4,5,6,7,8];varsum1=arr.sum();//36vararr2=[{Name:"A",Val:1},{Name:"B",Val:2}];varsum2=arr2.sum(function(t){returnt.Val});//3J**ascriptLinq条件查询WhereArray.prototype.where=Array.prototype.filter||function(predicate,context){context=context||window;vararr=[];varl=this.length;for(vari=0;i<l;i++)if(***.call(context,this[i],i,this)===true)arr.push(this[i]);returnarr;};vararr=[1,2,3,4,5];varres=arr.where(function(t){returnt>2});//[3,4,5]AnyArray.prototype.any=function(predicate,context){context=context||window;varf=this.some||function(p,c){varl=this.length;if(!p)returnl>0;while(l-->0)if(p.call(c,this[l],l,this)===true)returntrue;returnfalse;};returnf.apply(this,[predicate,context]);};vararr=[1,2,3,4,5];varres1=arr.any();//truevarres2=arr.any(function(t){returnt>5});//falseAllArray.prototype.all=function(predicate,context){context=context||window;predicate=predicate||DefaultPredicate;varf=this.every||function(p,c){returnthis.length==this.where(p,c).length;};returnf.apply(this,[predicate,context]);};vararr=[1,2,3,4,5];varres=arr.all(function(t){returnt<6});//trueContainsArray.prototype.contains=function(o,comparer){comparer=comparer||DefaultEqualityComparer;varl=this.length;while(l-->0)if(comparer(this[l],o)===true)returntrue;returnfalse;};vararr1=[1,2,3,4,5];varres1=arr.contains(2);//truevararr2=[{Name:"A",Val:1},{Name:"B",Val:1}];varres2=arr2.contains({Name:"C",Val:1},function(a,b){returna.Val==b.Val});//trueJ**asciprtLinq迭代ForEachArray.prototype.forEach=Array.prototype.forEach||function(callback,context){context=context||window;varl=this.length;for(vari=0;i<l;i++)***.call(context,this[i],i,this);};vararr=[1,2,3,4,5];arr.forEach(function(t){if(t%2==0)console.log(t);});DefaultIfEmptyArray.prototype.defaultIfEmpty=function(val){returnthis.length==0?[val==**ll?**ll:val]:this;};vararr=[1,2,3,4,5];varres=arr.where(function(t){returnt>5}).defaultIfEmpty(5);//[5]