fromq
fromq.js 是实现javascript环境中linq方法的一种实现。对数组内的对象进行each,where,select,orderby, groupby,count,max,min,sum,avg等操作,同时适用则表达式的匹配操作。 该项目是在JSLINQ基础上扩展而来,代码已经重新修改,使JSLINQ支持Lambda,正则表达式,字符串的操作,增加了集合的操作except、intersect、union、join、all、any、some、indexOf、contains、sum、avg. 除统计功能函数外,其他的函数都支持链式调用。即如下面代码:
;
下面的样例代码一般省略require部分,除非有其他引用时,会增加require部分,以求代码的可读性。 如果想了解lambda相关的知识,请移步这里: JavaScript Lambda 编译器实现 JavaScript与Lambda
本篇只是对fromq.js的各功能调用进行说明与举例。fromq.js源代码已经放置在github上,需要fromq.js源代码请移步这里.
相关的使用方法,请关注我的博客,http://www.bonashen.com。
1.字符串分隔
fromq的字符串的默认分隔符为",".
;
;
2.数组操作
2.1 常用操作
let
调用格式:let(/*Object*/value);
功能描述:提供fromq后缀方法中的访问外部的引用。详见 fromq.let功能使用。
返回结果:fromq
调用样例:
;//[2,3] ;//[2,3] ; //[6]
each | forEach
调用格式:each(/*function|Lambda*/callback=function(/*object*/item,/*Number*/index){return true;})
功能描述:遍历所有的数组元素,直到callback返回值非null | undefined终止.
返回结果:fromq
调用样例:
;;;
select | map
调用格式:select(/*Function|Lambda|String fields*/clause=function(/*Object*/item,/*Number*/index){return {};})
功能描述:遍历所有的数组元素,将clause()返回值作为数组元素重新组织为新数组并返回新的fromq.
返回结果:fromq
调用样例:
; ;
//many feilds select examplevar log=; ;
where | filter
调用格式:where(/*Function|Lambda*/clause=function(/*Object*/item,/*Number*/index){})
功能描述:遍历所有的数据元素,将clause()返回值为true的数组元素重新组织为新数组并返回新的fromq.
返回结果:fromq
调用样例:
; ; letconsolelog ;
concat
调用格式:concat(/*Array|formq*/it)
功能描述:将原数组元素与需连接数组it或者**it.toArray()**进行数组连接操作并返回新的fromq,对原数组没有影响.
返回结果:fromq
调用样例:
; ;
toArray
调用格式:toArray(/*Array*/it,/*boolean*/overwrite)
功能描述:若it是数组时,默认清空it数组,并将当前数组数据追加至it数组中,并返回fromq内部数组引用.
- 若overwrite为false,不清空it数组,直接将当前数组数据追加至it数组中。
返回结果:Array|null 调用样例:
;
distinct
调用格式:distinct(/*Function|Lambda|String field*/clause=function(item,index){}, /*boolean*/distinctValue)
功能描述:遍历数组,依据clause()返回值作为数组元素唯一性判断,过滤重复项元素,重新组织并返回fromq.
- 若clause为空时,以数组元素作为唯一性判断依据。
- 若distinctValue为true时,clause()返回值作为新fromq的数组元素。
返回结果:fromq 调用样例:
; ; ; ;
2.2 数组及元素检测
isEmpty
调用格式:isEmpty();
功能描述:检测数组是否为空,若空为true。
返回结果:false|true
调用样例:
if console;
all|every
调用格式:all(clause=function(/*Object*/item,/*Number*/index){});
功能描述:检测数组所有元素是否满足clause条件,都满足为true。
返回结果:false|true
调用样例:
all{return item<=3};
any|some
调用格式:all(clause=function(/*Object*/item,/*Number*/index){});
功能描述:检测数组是否有满足clause条件的元素,有为true。
返回结果:false|true
调用样例:
all{return item<=3};
contains
调用格式:contains(/*Function|Lambda|value*/clause=function(/*Object*/item,/*Number*/index){});
功能描述:检测数组是否有满足clause的元素,有为true
返回结果:false|true
调用样例:
;
2.3 定位数组元素
indexOf
调用格式:indexOf(/*Function|Lambda|value*/clause=function(/*Object*/item,/*Number*/index){});
功能描述:检索数组满足clause条件第一个元素的位置,没有则返回-1.
返回结果:Number
调用样例:
; ; ; ;
first | head
调用格式:first(/*Function|Lambda*/clause=function(/*Object*/item,/*Number*/index){});
功能描述:检索数组满足clause条件第一位元素,没有则返回null.
- 若clause为空时,则返回数组第一位元素。
返回结果:object|null
调用样例:
; ; ; ;
firstOrDefault | headOrDefault
调用格式:firstOrDefault(/*Function|Lambda*/clause=function(/*Object*/item,/*Number*/index){},defaultValue);
功能描述:检索数组满足clause条件第一位元素,没有则返回defaultValue.
返回结果:object|defaultValue
调用样例:
; ; ;
last | tail
调用格式:last(/*Function|Lambda*/clause=function(/*Object*/item,/*Number*/index){});
功能描述:检索数组满足clause条件末位元素,没有则返回null.
返回结果:object|null
调用样例:
; ; ;
lastOrDefault | tailOrDefault
调用格式:lastOrDefault(/*Function|Lambda*/clause=function(/*Object*/item,/*Number*/index){},defaultValue);
功能描述:检索数组满足clause条件末位元素,没有则返回defaultValue.
返回结果:object|defaultValue
调用样例:
; ; ;
elementAt
调用格式:elementAt(/*Number*/index);
功能描述:取位于index处的数组元素.
返回结果:object
调用样例:
;
elementAtOrDefault
调用格式:elementAtOrDefault(/*Number*/index,defaultValue);
功能描述:取位于index处的数组元素,如果index越界返回defaultValue.
返回结果:object|defaultValue
调用样例:
;
take
调用格式:take(/*number*/top, /*function|Lambda*/clause=function(item,index){});
功能描述:依据clause()返回值过滤后,取前top数量的元素,重新组织并返回fromq.
返回结果:fromq
调用样例:
;;;;
skip
调用格式:skip(/*number*/count, /*function|Lambda*/clause=function(item,index){});
功能描述:依据clause()返回值过滤后,从count处开始取剩余的元素,重新组织并返回fromq.
返回结果:fromq
调用样例:
;;;;
takeRange
调用格式:takeRange(/*number*/start,/*number*/end, /*function|Lambda*/clause=function(item,index){});
功能描述:依据clause()返回值过滤后,取start至end处的数组元素,并重新组织并返回fromq.
返回结果:fromq
调用样例:
;//获得同样数组元素的新fromq对象;//获得从2开始后剩余数组元素组成的fromq对象;;;;
random
调用格式:random(/*number*/count);
功能描述:随机从数组中选择count数量的元素,并重新组织并返回fromq.
返回结果:fromq
调用样例:
var s = ;console;/* out:1,3,9,9,6*/
2.4 数组统计
size
调用格式:size();
功能描述:统计数组元素的数量.
返回结果:Number
调用样例:
fromqutils size;
max
调用格式:max(/*Function|Lambda|String field*/clause=function(item){});
功能描述:指定列或clause()返回值的最大数的数组元素.
返回结果:object
调用样例:
;//3 ;//3;//3 console;//3
min
调用格式:min(/*Function|Lambda|String field*/clause=function(item){});
功能描述:指定列或clause()返回值的最小数的数组元素.
返回结果:object
调用样例:
;//1 ;//1;//1 console;//1
sum | aggregate
调用格式:sum(/*Function|Lambda|String fields*/clause=function(item,/*Number*/index));
功能描述:统计指定列或clause()返回值的和.
返回结果:Number|Float|NaN
调用样例:
; ;; console;
avg | average
调用格式:avg(/*Function|Lambda|String fields*/clause=function(item,/*Number*/index));
功能描述:统计指定列或clause()返回值的平均数.
返回结果:Number|Float|NaN
调用样例:
; ;; console;
2.5 排序分页与分组
orderBy | sort
调用格式:orderBy(/*Function|Lambda|String fields*/clause=function(item){},customCompar=false);
功能描述:依据各数组元素的clause(item)返回值对数组元素进行升序排序。若customCompare为true,侧依据clause(a,b)返回值-1,0,1进行数组元素升序排序。
返回结果:fromq
调用样例:
;; //order by value. ; // order by object property value. ;
orderByDescending | orderByDesc
调用格式:orderByDescending(/*Function|Lambda|String fields*/clause=function(item){},customCompare=false);
功能描述:依据各数组元素的clause(item)返回值对数组元素进行降序排序。若customCompare为true,侧依据clause(a,b)返回值-1,0,1进行数组元素降序排序。
返回结果:fromq
调用样例:
;; //order by value. ; // order by object property value. ;
paging
调用格式:paging(/*Number*/nextCount,/*Function|Lambda*/clause=function(item,/*Number*/index){return true});
功能描述:依据各数组元素的clause(item,index)返回值对数组元素进行过滤后生成fromq,并缓存至paginger中。
返回结果:paginger
调用样例:
var paginger = fromqutils;paginger ;console;
groupBy
调用格式:groupBy(/*Function|Lambda|String fields*/clause=function(item,/*Number*/index){});
功能描述:依据各数组元素的clause(item,index)返回值对数组元素进行分组。clause(item,index)返回值可以是任何值,若为数组,则进行多层分组。
返回结果:grouped
调用样例:
; //group by value. ; // group by object property value. //select group object,total each group item value. ;
count|countBy
调用格式:count(/*Function|Lambda|String fields*/clause=function(item,/*Number*/index){});
功能描述:依据各数组元素的clause(item,index)返回值对数组元素进行分组计数。clause(item,index)返回值可以是任何值。
返回结果:fromq
调用样例:
;
2.6 集合运算
union
调用格式:union(/*Array|fromq*/second, /*Function|lambda|String FieldName*/clause=function(item,index){return distinct});
功能描述:依赖clause()返回值作为唯一值,合并两个数组并过滤相同项。
返回结果:fromq
调用样例:
var People1 = ID: 1 FirstName: "Bona" LastName: "Shen" ID: 2 FirstName: "Kerry" LastName: "Xue" ;var People2 = ID: 1 FirstName: "Bona" LastName: "Shen" ID: 3 FirstName: "Peter" LastName: "Shen" ; ; ; ;
intersect
调用格式:intersect(/*Array|fromq*/second, /*Function|lambda|String FieldName*/clause=function(item,index){return distinct});
功能描述:依赖clause()返回值作为唯一值,过滤重复项后,检索两个数组相同项(相交),重新组织为fromq。
返回结果:fromq
调用样例:
var People1 = ID: 1 FirstName: "Bona" LastName: "Shen" ID: 2 FirstName: "Kerry" LastName: "Xue" ;var People2 = ID: 1 FirstName: "Bona" LastName: "Shen" ID: 3 FirstName: "Peter" LastName: "Shen" ; ; ; ;
except
调用格式:except(/*Array|fromq*/second, /*Function|lambda|String FieldName*/clause=function(item,index){return distinct});
功能描述:依赖clause()返回值作为唯一值,过滤重复项后,检索两个数组不相同项(与非),重新组织为fromq。
返回结果:fromq
调用样例:
var People1 = ID: 1 FirstName: "Bona" LastName: "Shen" ID: 2 FirstName: "Kerry" LastName: "Xue" ;var People2 = ID: 1 FirstName: "Bona" LastName: "Shen" ID: 3 FirstName: "Peter" LastName: "Shen" ; ; ; ;
innerJoin
调用格式:innerJoin(/*Array|fromq*/second, /*Function|lambda|String fields*/comparer=function(a,b){return true}, /*Function|Lambda*/selector=function(a,b){return {};});
功能描述:依赖comparer(a,b)返回值判断second集合中是否存在元素a,若存在则将selector(a,b)的返回值作为数组元素,若不存在则不调用selector(a,b),并将selector(a,b)的值重新组织为fromq。
返回结果:fromq
调用样例:
var People1 = ID: 1 FirstName: "Bona" LastName: "Shen" ID: 2 FirstName: "Kerry" LastName: "Xue" ID: 3 FirstName: "Peter" LastName: "Shen" ID: 4 FirstName: "YingChun" LastName: "Xue" ;var People2 = ID: 1 Age:38 ID: 3 Age:11 ID: 2 Age:5 ; ;
leftJoin
调用格式:leftJoin(/*Array|fromq*/second, /*Function|lambda|String fields*/comparer=function(a,b){return true}, /*Function|Lambda*/selector=function(a,b){return {};});
功能描述:依赖comparer(a,b)返回值判断second集合中是否存在元素a,若不存在将b置为空对象{}
,无论存在与否都将selector(a,b)的返回值作为数组元素重新组织为fromq。
返回结果:fromq
调用样例:
var People1 = ID: 1 FirstName: "Bona" LastName: "Shen" ID: 2 FirstName: "Kerry" LastName: "Xue" ID: 3 FirstName: "Peter" LastName: "Shen" ID: 4 FirstName: "YingChun" LastName: "Xue" ;var People2 = ID: 1 Age:38 ID: 3 Age:11 ID: 2 Age:5 ; ; ; ;
in | within
调用格式:in(/*Array|fromq*/second, /*Function|lambda|String field*/distinctClause=function(item,index){return {};});
功能描述:先对second以distinctClause(item,index)返回值进行唯一选择,再对原数组元素以distinctClause(item,index)返回值作为唯一值判断second唯一集合中是否存在元素相同元素,若存在则将item作为数组元素重新组织为fromq。
详细用法请查看fromq.in fromq.notIn功能用例
返回结果:fromq
调用样例:
var People1 = ID: 1 FirstName: "Bona" LastName: "Shen" ID: 2 FirstName: "Kerry" LastName: "Xue" ID: 3 FirstName: "Peter" LastName: "Shen" ID: 4 FirstName: "YingChun" LastName: "Xue" ;var People2 = ID: 2 FirstName: "Kerry" LastName: "Xue" ID: 3 FirstName: "Peter" LastName: "Shen" ; ; ; ;
notIn | without
调用格式:notIn(/*Array|fromq*/second, /*Function|lambda|String field*/distinctClause=function(item,index){return {};});
功能描述:先对second以distinctClause(item,index)返回值进行唯一选择,再对原数组元素以distinctClause(item,index)返回值作为唯一值判断second唯一集合中是否存在元素相同元素,若不存在则将item作为数组元素重新组织为fromq。
详细用法请查看fromq.in fromq.notIn功能用例
返回结果:fromq
调用样例:
var People1 = ID: 1 FirstName: "Bona" LastName: "Shen" ID: 2 FirstName: "Kerry" LastName: "Xue" ID: 3 FirstName: "Peter" LastName: "Shen" ID: 4 FirstName: "YingChun" LastName: "Xue" ;var People2 = ID: 2 FirstName: "Kerry" LastName: "Xue" ID: 3 FirstName: "Peter" LastName: "Shen" ; ; ; ;
3.数组分组对象(grouped)
分组对象是fromq().groupBy函数的返回结果集。他提供了对分组后的对象进行数组元素的遍历、选择,通过选择功能select你可以实现分组的统计功能。
each
调用格式:each(/*Function|Lambda*/clause=function(/*Object*/group,/*fromq*/items){});
功能描述:遍历分组对象的数组元素,若clause()返回非null | undefined时结束遍历。
返回结果:grouped
调用样例:
//example1 ; }); //example2
select
调用格式:select(/*Function|Lambda*/clause=function(/*fromq*/group,/*fromq*/items){});
功能描述:遍历分组对象的数组元素,重新组织clause()返回值为fromq对象。
返回结果:fromq
调用样例:
;
count
调用格式:count();
功能描述:对各分组的元素数量进行统计,集合分组名为新值对象,重新生成数组,并返回fromq。
值对象的格式如下:
key:'group name' value: size
返回结果:fromq 调用样例:
;
getCache
调用格式:getCache();
功能描述:获取分组对象的数据。
返回结果:object
调用样例:
console;
4.数组分页对象(paginger)
分页对象是fromq().paging函数的返回结果集。他提供对数组元素按页的遍历、选择等fromq功能。
each
调用格式:each(/*Function|Lambda*/clause=function(/*fromq\*rdsq,/*Number*/pageNo){return false});
功能描述:遍历每一页,若clause()返回非null | undefined时结束遍历。
返回结果:paginger
调用样例:
var log=consolelog;var paginger = ;paginger; //for lambdapaginger;
select
调用格式:select(/*Function|Lambda*/clause=function(/*fromq*/rdsq,/*Number*/pageNo){});
功能描述:遍历每一页,按页重新组织clause()返回值为fromq对象。
返回结果:fromq
调用样例:
var paginger = fromq;paginger;//for lambdapaginger ;
setNextCount
调用格式:setNextCount(/*Number*/count);
功能描述:设置每页的记录数量。
返回结果:null
调用样例:
paginger;
pageCount
调用格式:pageCount();
功能描述:依据每一页的记录数量与缓存的记录数计算总页数。
返回结果:Number>=0
调用样例:
var pageCount = fromq;console;
getPageNo
调用格式:getPageNo(/*object*/item);
功能描述:返回item所处页的页码,若item=null | undefined,则返回当前页的页码。
返回结果:Number
调用样例:
var paginger = fromq;paginger;console;
isEmpty
调用格式:isEmpty();
功能描述:判断Paginger的缓存数据是否为空。
返回结果:true|false
调用样例:
var paginger = fromq;console;
getCache
调用格式:getCache();
功能描述:获取Paginger的缓存数据。
返回结果:fromq
调用样例:
var paginger = fromq;console;
getCacheCount
调用格式:getCacheCount();
功能描述:获取Paginger的缓存数据的数组长度。
返回结果:fromq
调用样例:
var paginger = fromq;console;
gotoPage
调用格式:gotoPage(/*Number*/pageNumber);
功能描述:跳转到pageNumber,并获取PageNumber的数据。
返回结果:fromq
调用样例:
var paginger = fromq;paginger ;
first
调用格式:first();
功能描述:跳转到第一页,并获取该页的数据。
返回结果:fromq
调用样例:
var paginger = fromq;paginger ;
last
调用格式:last();
功能描述:跳转到末页,并获取该页的数据。
返回结果:fromq
调用样例:
var paginger = fromq;paginger ;
next
调用格式:next();
功能描述:移到下一页,并获取该页的数据。
返回结果:fromq
调用样例:
var paginger = fromq;paginger next ;
prior
调用格式:prior();
功能描述:移到上一页,并获取该页的数据。
返回结果:fromq
调用样例:
var paginger = fromq;paginger ;
current
调用格式:current();
功能描述:获取当前页的数据。
返回结果:fromq
调用样例:
var paginger = fromq;paginger current ;
indexOf
调用格式:indexOf(/*Object*/item);
功能描述:获取item在Cache中的索引值。
返回结果:Number
- 若返回结果为
-1
,表示item不在Cache中。
调用样例:
var paginger = fromq;paginger ;
isTail
调用格式:isTail();
功能描述:判断当前页是否是末尾页。
返回结果:true|false
调用样例:
var paginger = fromq;pagingernext;console ;
isTop
调用格式:isTop();
功能描述:判断当前页是否是顶页。
返回结果:true|false
调用样例:
var paginger = fromq;paginger;console ;
5.正则表达式操作
fromq可以进行正则表达式的匹配操作,主要有两个函数,fromq(RegExp)和match(str)。具体使用详细如下说明。
fromq
调用格式:fromq(/*RegExp*/it,/*String*/str);
功能描述:使用it对str进行正则表达式匹配,组织匹配结果为fromq对象。
返回结果:fromq
调用样例:
;
match
调用格式:match(/*String*/str);
功能描述:使用fromq对象创建时的it值对str进行正则表达式匹配,组织匹配结果为fromq对象。
返回结果:fromq
调用样例:
;
6.Lambda使用
fromq | fromq.lambda
调用格式:fromq(/*String*/it,/*Boolean*/isClosure);
功能描述:fromq可以将符合Lambda规范的字符串编译为匿名函数。
返回结果:Function
调用样例:
;fromq;; //带有闭包函数体fromq;
;/*function anonymous(o) {'use strict';return console.log(o);}*/ ;/*function anonymous(o) {'use strict';return (function(o){console.log(o)}).apply(this,arguments);}*/
7.其他静态功能(utils)
其他静态功能是指fromq.utils包中的静态方法,可以通过fromq.utils直接引用。
random
调用格式:random(/*Number*/minValue,/*Number*/maxValue,/*Number*/count);
功能描述:随机产生minValue-maxValue范围内的count数量的数组,并返回fromq。
- maxValue为null时,产生0-minValue之间的数值;
- count缺省时,默认为1;
返回结果:fromq 调用样例:
var s = fromqutils;console;/*out:43,64,23,32,86*/
range
调用格式:range(/*Number*/start, /*Number*/end, /*Number*/step);
功能描述:按setp步长生成从start到end的数组元素并返回fromq。
- 若仅有start,则生成0-start个数组元素
- 若仅缺step,则以1为步长
返回结果:fromq 功能已经有所修缮,详见【新增fromq.equal,into功能,修缮了range功能】
调用样例:
fromq utils ;fromq utils ;fromq utils ;
repeat
调用格式:repeat(/*String*/it, /*Number*/count);
功能描述:重复生成count数量的it数组元素并返回fromq。
返回结果:fromq
调用样例:
fromq utils ;/*out: aaaa*/
trim
调用格式:trim(/*String*/it);
功能描述:删除it字符串的前尾空白字符并返回。
返回结果:String
调用样例:
var src = " a ";console;//3console;//1
initialToUpperCase
调用格式:initialToUpperCase(/*String*/it);
功能描述:将字符串中首个单词的首字母转为大写字母。
返回结果:String
调用样例:
var src = " hello world ";console;var dsrc = fromqutils;console;/*out:' hello world ', length:13' Hello world ', length:13*/
initialsToUpperCase
调用格式:initialsToUpperCase(/*String*/it);
功能描述:将字符串中每个单词的首字母转为大写字母。
返回结果:String
调用样例:
var src = " hello world ";console;var dsrc = fromqutils;console;/*out:' hello world ', length:13' Hello World ', length:13*/
isArray
调用格式:isArray(/*array*/it);
功能描述:判断it是否是数组。
返回结果:true|false
调用样例:
console; //true
isFunction
调用格式:isFunction(/*Function*/it);
功能描述:判断it是否是函数。
返回结果:true|false
调用样例:
console; //true
isString
调用格式:isString(/*String*/it);
功能描述:判断it是否是字符串。
返回结果:true|false
调用样例:
console; //trueconsole; //true
isNumber
调用格式:isNumber(/*String|Number*/it);
功能描述:判断it是否是整数。
返回结果:true|false
调用样例:
console; //trueconsole; //trueconsole; //falseconsole; //false
isFloat
调用格式:isFloat(/*String|Number*/it);
功能描述:判断it是否是实数。
返回结果:true|false
调用样例:
console; //trueconsole; //trueconsole; //trueconsole; //true