npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

fromq

v0.1.0

Published

fromq is linq for javascript

Downloads

1

Readme

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(["your path/fromq.js"],function(fromq){
    console.log(fromq("1,2,3,4,5").each(function(item){
        console.log(item);
    }).sum());
});

下面的样例代码一般省略require部分,除非有其他引用时,会增加require部分,以求代码的可读性。 如果想了解lambda相关的知识,请移步这里: JavaScript Lambda 编译器实现 JavaScript与Lambda

本篇只是对fromq.js的各功能调用进行说明与举例。fromq.js源代码已经放置在github上,需要fromq.js源代码请移步这里.

相关的使用方法,请关注我的博客,http://www.bonashen.com


1.字符串分隔

fromq的字符串的默认分隔符为",".

    fromq("1,2,3,4,5").each(function(item){
        console.log(item);
    });
	fromq("1,2,3,4,5",",").each(function(item){   //指定分隔符,
        console.log(item);
    });

2.数组操作

2.1 常用操作

let

调用格式:let(/*Object*/value); 功能描述:提供fromq后缀方法中的访问外部的引用。详见 fromq.let功能使用。 返回结果:fromq 调用样例:

fromq("1,2,3").let(2).where("(o,i,v)=>o>=v");//[2,3]

fromq("1,2,3").let({value:2}).where("(o,i,v)=>o>=v.value");//[2,3]

fromq("1,2,3").let(2).where("(o,i,v)=>o>v").select("(o,i,v)=>o*v"); //[6]
each | forEach

调用格式:each(/*function|Lambda*/callback=function(/*object*/item,/*Number*/index){return true;}) 功能描述:遍历所有的数组元素,直到callback返回值非null | undefined终止. 返回结果:fromq 调用样例:

fromq([1, 2, 3]).each(function (item, index) {
        console.log('index at:', index, '\tvalue is:', item);
});
fromq([1, 2, 3]).each("(item, index) =>console.log('index at:', index, '\tvalue is:', item)");
fromq([1, 2, 3]).let({value:3,log:console.log}).each("(o, i,n) =>n.log('index at:', i, '\tvalue is:', o,'\t'+o+'*'+n.value+'=',n.value*o)");

select | map

调用格式:select(/*Function|Lambda|String fields*/clause=function(/*Object*/item,/*Number*/index){return {};}) 功能描述:遍历所有的数组元素,将clause()返回值作为数组元素重新组织为新数组并返回新的fromq. 返回结果:fromq 调用样例:

fromq([1,2,3,4,5,6])
    .select(function(item,index){
        return {index:index,value:item};
        });
        
fromq([1,2,3,4,5,6])
    .select("(o,i)=>{index:i,value:o}");
//many feilds select example
var log=fromq("o=>console.log(o)",true);
fromq([1,2,3,4,5,6])
    .select("(o,i)=>{index:i,value:o}")
    .each(log)
    .select("index,value")
    .each(log)
    .select("value")
    .each(log);

where | filter

调用格式:where(/*Function|Lambda*/clause=function(/*Object*/item,/*Number*/index){}) 功能描述:遍历所有的数据元素,将clause()返回值为true的数组元素重新组织为新数组并返回新的fromq. 返回结果:fromq 调用样例:

 fromq([1,2,3,4,5,6])
    .where(function(item){
        return item<5
        })
     .each(function(item){  
            console.log(item);
    });
fromq([1,2,3,4,5,6])
    .where("o=>o<5")
    .each("o=>console.log(o)");
fromq([1,2,3,4,5,6])
    .let(5)
    .where("(o,i,n)=>o<n")
    let(console.log)
    .each("(o,i,log)=>log(o)");

concat

调用格式:concat(/*Array|formq*/it) 功能描述:将原数组元素与需连接数组it或者**it.toArray()**进行数组连接操作并返回新的fromq,对原数组没有影响. 返回结果:fromq 调用样例:

fromq([1,2,3])
    .concat([2,3,4])
    .each(function(item){  
        console.log(item);
    });
    
fromq([1,2,3])
    .concat(fromq([2,3,4]))
    .each(function(item){  
        console.log(item);
    });    

toArray

调用格式:toArray(/*Array*/it,/*boolean*/overwrite) 功能描述:若it是数组时,默认清空it数组,并将当前数组数据追加至it数组中,并返回fromq内部数组引用.

  • 若overwrite为false,不清空it数组,直接将当前数组数据追加至it数组中。

返回结果:Array|null 调用样例:

    fromq([1,2,3]).concat([2,3,4]).toArray();    

distinct

调用格式:distinct(/*Function|Lambda|String field*/clause=function(item,index){}, /*boolean*/distinctValue) 功能描述:遍历数组,依据clause()返回值作为数组元素唯一性判断,过滤重复项元素,重新组织并返回fromq.

  • 若clause为空时,以数组元素作为唯一性判断依据。
  • 若distinctValue为true时,clause()返回值作为新fromq的数组元素。

返回结果:fromq 调用样例:

    fromq([1,2,3,4,2,3]).distinct();    
    fromq([1,2,3,4,2,3]).distinct(function(item){return item;});
    fromq([1,2,3,4,2,3]).distinct("o=>o");
    fromq([1,2,3,4,2,3]).distinct("o=>o*2",true);

2.2 数组及元素检测

isEmpty

调用格式:isEmpty(); 功能描述:检测数组是否为空,若空为true。 返回结果:false|true 调用样例:

    if(fromq([1,2,3]).isEmpty()){
        console.log('The array is empty.');
        }

all|every

调用格式:all(clause=function(/*Object*/item,/*Number*/index){}); 功能描述:检测数组所有元素是否满足clause条件,都满足为true。 返回结果:false|true 调用样例:

    fromq([1,2,3]).all(function(item,index){return item<=3});    

any|some

调用格式:all(clause=function(/*Object*/item,/*Number*/index){}); 功能描述:检测数组是否有满足clause条件的元素,有为true。 返回结果:false|true 调用样例:

    fromq([1,2,3]).all(function(item,index){return item<=3});    

contains

调用格式:contains(/*Function|Lambda|value*/clause=function(/*Object*/item,/*Number*/index){}); 功能描述:检测数组是否有满足clause的元素,有为true 返回结果:false|true 调用样例:

    fromq([1,2,3]).contains(function(item,index){return item<=3});    

2.3 定位数组元素

indexOf

调用格式:indexOf(/*Function|Lambda|value*/clause=function(/*Object*/item,/*Number*/index){}); 功能描述:检索数组满足clause条件第一个元素的位置,没有则返回-1. 返回结果:Number 调用样例:

    fromq([1,2,3]).indexOf(function(item,index){return item<=3});    
    fromq([1,2,3]).indexOf(3);
    fromq([1,2,3]).indexOf("o=>o==3"); 
    fromq([1,2,3]).let(3).indexOf("(o,i,n)=>o==n");    

first | head

调用格式:first(/*Function|Lambda*/clause=function(/*Object*/item,/*Number*/index){}); 功能描述:检索数组满足clause条件第一位元素,没有则返回null.

  • 若clause为空时,则返回数组第一位元素。

返回结果:object|null

调用样例:

    fromq([1,2,3]).first();  
    fromq([1,2,3]).first(function(item,index){return item<=3});    
    fromq([1,2,3]).first("o=>o<=3");  
    fromq([1,2,3]).let({value:3}).first("(o,i,n)=>o<=n.value");

firstOrDefault | headOrDefault

调用格式:firstOrDefault(/*Function|Lambda*/clause=function(/*Object*/item,/*Number*/index){},defaultValue); 功能描述:检索数组满足clause条件第一位元素,没有则返回defaultValue. 返回结果:object|defaultValue 调用样例:

    fromq([1,2,3]).firstOrDefault(function(item,index){return item>4},4);    
    fromq([1,2,3]).firstOrDefault("o=>o>4",4);    
    fromq([1,2,3]).let({value:4}).firstOrDefault("(o,i,n)=>o>n.value",4);

last | tail

调用格式:last(/*Function|Lambda*/clause=function(/*Object*/item,/*Number*/index){}); 功能描述:检索数组满足clause条件末位元素,没有则返回null. 返回结果:object|null 调用样例:

    fromq([1,2,3]).last(function(item,index){return item<=3});    
    fromq([1,2,3]).last("o=>o<=3");  
    fromq([1,2,3]).let({value:3}).last("(o,i,n)=>o<=n.value");

lastOrDefault | tailOrDefault

调用格式:lastOrDefault(/*Function|Lambda*/clause=function(/*Object*/item,/*Number*/index){},defaultValue); 功能描述:检索数组满足clause条件末位元素,没有则返回defaultValue. 返回结果:object|defaultValue 调用样例:

fromq([1,2,3]).lastOrDefault(function(item,index){return item>4},4);    
fromq([1,2,3]).lastOrDefault("o=>o>4",4);    
fromq([1,2,3]).let({value:4}).lastOrDefault("(o,i,n)=>o>n.value",4);

elementAt

调用格式:elementAt(/*Number*/index); 功能描述:取位于index处的数组元素. 返回结果:object 调用样例:

fromq([1,2,3]).elementAt(2);

elementAtOrDefault

调用格式:elementAtOrDefault(/*Number*/index,defaultValue); 功能描述:取位于index处的数组元素,如果index越界返回defaultValue. 返回结果:object|defaultValue 调用样例:

fromq([1,2,3]).elementAtOrDefault(3,4);

take

调用格式:take(/*number*/top, /*function|Lambda*/clause=function(item,index){}); 功能描述:依据clause()返回值过滤后,取前top数量的元素,重新组织并返回fromq. 返回结果:fromq 调用样例:

fromq([1,2,3]).take(2);
fromq([1,2,3]).take(2,function(item){return item<4});
fromq([1,2,3]).take(2,"o=>o<4");
fromq([1,2,3]).let({value:4}).take(2,"(o,i,n)=>o<n.value");

skip

调用格式:skip(/*number*/count, /*function|Lambda*/clause=function(item,index){}); 功能描述:依据clause()返回值过滤后,从count处开始取剩余的元素,重新组织并返回fromq. 返回结果:fromq 调用样例:

fromq([1,2,3]).skip(2);
fromq([1,2,3]).skip(2,function(item){return item<4});
fromq([1,2,3]).skip(2,"o=>o<4");
fromq([1,2,3]).let({value:4}).skip(2,"(o,i,n)=>o<n.value");

takeRange

调用格式:takeRange(/*number*/start,/*number*/end, /*function|Lambda*/clause=function(item,index){}); 功能描述:依据clause()返回值过滤后,取start至end处的数组元素,并重新组织并返回fromq. 返回结果:fromq 调用样例:

fromq([1,2,3]).takeRange();//获得同样数组元素的新fromq对象
fromq([1,2,3]).takeRange(2);//获得从2开始后剩余数组元素组成的fromq对象
fromq([1,2,3]).takeRange(2,3);
fromq([1,2,3]).takeRange(2,function(item){return item<4});
fromq([1,2,3]).takeRange(2,"o=>o<4");
fromq([1,2,3]).let({value:4}).takeRange(2,"(o,i,n)=>o<n.value");

random

调用格式:random(/*number*/count); 功能描述:随机从数组中选择count数量的元素,并重新组织并返回fromq. 返回结果:fromq 调用样例:

var s = fromq([1,3,6,9]).random(5).toString(",");
console.log(s);
/* out:
1,3,9,9,6
*/

2.4 数组统计

size

调用格式:size(); 功能描述:统计数组元素的数量. 返回结果:Number 调用样例:

fromq.utils.random(100,null,1000)
    .let(2)
    .where("(o,i,v)=>o%v==0")
    .size();

max

调用格式:max(/*Function|Lambda|String field*/clause=function(item){}); 功能描述:指定列或clause()返回值的最大数的数组元素. 返回结果:object 调用样例:

fromq([1,2,3]).max();//3

fromq([1,2,3]).max(function(item){return item;});//3
fromq([1,2,3]).max("o=>o");//3

console.log("max:\t",fromq([1,2,3])
    .select("(o,i)=>{index:i,value:o}")
    .each("o=>console.log(o)")
    .max("value"));//3

Image Title


min

调用格式:min(/*Function|Lambda|String field*/clause=function(item){}); 功能描述:指定列或clause()返回值的最小数的数组元素. 返回结果:object 调用样例:

fromq([1,2,3]).min();//1

fromq([1,2,3]).min(function(item){return item;});//1
fromq([1,2,3]).min("o=>o");//1

console.log("min:\t",fromq([1,2,3])
    .select("(o,i)=>{index:i,value:o}")
    .each("o=>console.log(o)")
    .min("value"));//1

sum | aggregate

调用格式:sum(/*Function|Lambda|String fields*/clause=function(item,/*Number*/index)); 功能描述:统计指定列或clause()返回值的和. 返回结果:Number|Float|NaN 调用样例:

fromq([1,2,3]).sum();

fromq([1,2,3]).sum(function(item){return item;});
fromq([1,2,3]).sum("o=>o");

console.log("sum:\t",fromq([1,2,3])
    .select("(o,i)=>{index:i,value:o}")
    .each("o=>console.log(o)")
    .sum("value"));

avg | average

调用格式:avg(/*Function|Lambda|String fields*/clause=function(item,/*Number*/index)); 功能描述:统计指定列或clause()返回值的平均数. 返回结果:Number|Float|NaN 调用样例:

fromq([1,2,3]).avg();

fromq([1,2,3]).avg(function(item){return item;});
fromq([1,2,3]).avg("o=>o");

console.log("avg:\t",fromq([1,2,3])
    .select("(o,i)=>{index:i,value:o}")
    .each("o=>console.log(o)")
    .avg("value"));

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 调用样例:

fromq([1,2,3]).orderBy();
fromq([1,2,3]).orderBy("o=>o");  //order by value.
fromq([1,2,3])
    .select("(o,i)=>{index:i,value:o}")
    .each("o=>console.log(o)")
    .orderBy("value,index");   // order by object property value.
fromq([1,2,3])
    .select("(o,i)=>{index:i,value:o}")
    .orderBy(function(a,b){    //custom comparer
        return a.value<b.value?-1:a.value>b.value?1:0;  
    },true);

orderByDescending | orderByDesc

调用格式:orderByDescending(/*Function|Lambda|String fields*/clause=function(item){},customCompare=false); 功能描述:依据各数组元素的clause(item)返回值对数组元素进行降序排序。若customCompare为true,侧依据clause(a,b)返回值-1,0,1进行数组元素降序排序。 返回结果:fromq 调用样例:

fromq([1,2,3]).orderByDescending();
fromq([1,2,3]).orderByDescending("o=>o");  //order by value.
fromq([1,2,3])
    .select("(o,i)=>{index:i,value:o}")
    .each("o=>console.log(o)")
    .orderByDescending("value,index");   // order by object property value.
fromq([1,2,3])
    .select("(o,i)=>{index:i,value:o}")
    .orderByDescending(function(a,b){    //custom comparer
        return a.value<b.value?-1:a.value>b.value?1:0;  
    },true);

paging

调用格式:paging(/*Number*/nextCount,/*Function|Lambda*/clause=function(item,/*Number*/index){return true}); 功能描述:依据各数组元素的clause(item,index)返回值对数组元素进行过滤后生成fromq,并缓存至paginger中。 返回结果:paginger 调用样例:

var paginger = fromq.utils.range(100).paging(4,"o=>o%21==0");
paginger
    .each("(o,i,log)=>log('page number:',i);o.each('(a,i,log)=>log(a)',log)",console.log)
    .gotoPage(3).each("o=>console.log(o)");
console.log("Current Page No:",paginger.getPageNo());

groupBy

调用格式:groupBy(/*Function|Lambda|String fields*/clause=function(item,/*Number*/index){}); 功能描述:依据各数组元素的clause(item,index)返回值对数组元素进行分组。clause(item,index)返回值可以是任何值,若为数组,则进行多层分组。 返回结果:grouped 调用样例:

fromq([1,2,3,2,3,3]).
    groupBy("o=>o");  //group by value.
fromq([1,2,3,2,3,3])
    .select("(o,i)=>{index:i,value:o}")
    .each("o=>console.log(o)")
    .groupBy("value");   // group by object property value.

 fromq([1,2,3,2,3,3])
    .select("(o,i)=>{index:i,value:o}")
    .let({value:2})
    .groupBy(function(item,index,n){ 
      return   item.value>n.value?"value>"+n.value:"value<="+n.value;
    })
    .select("(g,i)=>{group:g,sum:i.sum('value'),count:i.count()}")
                              //select group object,total each group item value.
    .each('o=>console.log(o)');
    

count|countBy

调用格式:count(/*Function|Lambda|String fields*/clause=function(item,/*Number*/index){}); 功能描述:依据各数组元素的clause(item,index)返回值对数组元素进行分组计数。clause(item,index)返回值可以是任何值。 返回结果:fromq 调用样例:

fromq([1,2,3,2,3,3])
    .select("(o,i)=>{index:i,value:o}")
    .let({value:2})
    .countBy(function(item,index,n){ 
      return   item.value>n.value?"value>"+n.value:"value<="+n.value;
    })
    .each('o=>console.log(o)');

Image Title


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" }
    ];
fromq(People1)
    .union(People2,
    function (item) {
        return item.ID;
    }).each("o=>console.log(o)");
fromq(People1)
    .union(People2, "o=>o.ID")
    .each("o=>console.log(o)");
fromq(People1)
    .union(People2, "ID")
    .each("o=>console.log(o)");

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" }
    ];
fromq(People1)
    .intersect(People2,
    function (item) {
        return item.ID;
    }).each("o=>console.log(o)");
fromq(People1)
    .intersect(People2, "o=>o.ID")
    .each("o=>console.log(o)");
fromq(People1)
    .intersect(People2, "ID")
    .each("o=>console.log(o)");

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" }
    ];
fromq(People1)
    .except(People2,
    function (item) {
        return item.ID;
    }).each("o=>console.log(o)");
fromq(People1)
    .except(People2, "o=>o.ID")
    .each("o=>console.log(o)");
fromq(People1)
    .except(People2, "ID")
    .each("o=>console.log(o)");

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 }
    ];
fromq(People1)
    .innerJoin(People2, "(a,b)=>a.ID==b.ID",
        "(a,b)=>{id:a.ID,name:a.FirstName+'  '+a.LastName,age:b.Age}")
    .orderBy("age")    
    .each("o=>console.log(o)");

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 }
    ];
fromq(People1)
    .leftJoin(People2,
    function (a,b) {
        return a.ID==b.ID;
    },function(a,b){
        return {id:a.ID,name:a.FirstName+"  "+a.LastName,age:b.Age};    
    }).each("o=>console.log(o)");
fromq(People1)
    .leftJoin(People2, "(a,b)=>a.ID==b.ID",
        "(a,b)=>{id:a.ID,name:a.FirstName+'  '+a.LastName,age:b.Age}")
    .each("o=>console.log(o)");
fromq(People1)
    .leftJoin(People2, "ID",
    "(a,b)=>{id:a.ID,name:a.FirstName+'  '+a.LastName,age:b.Age}")
    .orderBy("age")    
    .each("o=>console.log(o)");

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" },
    ];
fromq(People1)
    .in(People2,"ID")
   .each("o=>console.log(o)");
fromq(People1)
    .in(People2, "o=>o.ID")
    .each("o=>console.log(o)");
fromq(People1)
    .in(People2, function(item){return item.ID;})
    .each("o=>console.log(o)");

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" },
    ];
fromq(People1)
    .notIn(People2,"ID")
   .each("o=>console.log(o)");
fromq(People1)
    .notIn(People2, "o=>o.ID")
    .each("o=>console.log(o)");
fromq(People1)
    .notIn(People2, function(item){return item.ID;})
    .each("o=>console.log(o)");

3.数组分组对象(grouped)

分组对象是fromq().groupBy函数的返回结果集。他提供了对分组后的对象进行数组元素的遍历、选择,通过选择功能select你可以实现分组的统计功能。

each

调用格式:each(/*Function|Lambda*/clause=function(/*Object*/group,/*fromq*/items){}); 功能描述:遍历分组对象的数组元素,若clause()返回非null | undefined时结束遍历。 返回结果:grouped 调用样例:

//example1
fromq([1,2,3,2,3,3]).
    groupBy("o=>o").
    each(function(group,items){
               console.log(group);   //print group value,also name 'group name'
    });
 });
 //example2
fromq([1,2,3,2,3,3])
    .select("(o,i)=>{index:i,value:o}")
    .let({value:2})
    .groupBy("(o,i,n)=>o.value>n.value?"value>"+n.value:"value<="+n.value;
    })
    .select("(g,i)=>{group:g,sum:i.sum('value'),count:i.count()}")
      //分组的统计
    .each('o=>console.log(o)');

select

调用格式:select(/*Function|Lambda*/clause=function(/*fromq*/group,/*fromq*/items){}); 功能描述:遍历分组对象的数组元素,重新组织clause()返回值为fromq对象。 返回结果:fromq 调用样例:

fromq([1, 2, 3, 2, 3, 3])
    .select('(o,i)=>{index:i,value:o}')
    .let({value:2})    
    .groupBy('(o,i,n)=>o.value>n.value? "value>" + n.value: "value<="+ n.value')
    .select('(g,i)=>{group:g,sum:i.sum(\'value\'),count:i.count(),items:i.toArray()}')
    .each('o=>console.log(o)');   

count

调用格式:count(); 功能描述:对各分组的元素数量进行统计,集合分组名为新值对象,重新生成数组,并返回fromq。 值对象的格式如下:

{key:'group name' ,value: size}

返回结果:fromq 调用样例:

fromq([1, 2, 3, 2, 3, 3])
    .select('(o,i)=>{index:i,value:o}')
    .let({value:2})    
    .groupBy('(o,i,n)=>o.value>n.value? "value>" + n.value: "value<="+ n.value')
    .count()
    .each('o=>console.log(o)');   

getCache

调用格式:getCache(); 功能描述:获取分组对象的数据。 返回结果:object 调用样例:

console.log(
    fromq([1, 2, 3, 2, 3, 3]).
    groupBy("o=>o").getCache());

4.数组分页对象(paginger)

分页对象是fromq().paging函数的返回结果集。他提供对数组元素按页的遍历、选择等fromq功能。 ####each 调用格式:each(/*Function|Lambda*/clause=function(/*fromq\*rdsq,/*Number*/pageNo){return false}); 功能描述:遍历每一页,若clause()返回非null | undefined时结束遍历。 返回结果:paginger 调用样例:

var log=console.log;
var paginger = fromq([1,2,3,4,5,6]).paging(3);
paginger.each(function(rdsq,pageNo){
    log("Page No:",pageNo);    
    rdsq.each(function(item,index){
        log(item);
    });
});

//for lambda
paginger.each("(rdsq,i,log)=>log('Page No:',i);rdsq.each('(o,i,log)=>log(o)',log)",log);

select

调用格式:select(/*Function|Lambda*/clause=function(/*fromq*/rdsq,/*Number*/pageNo){}); 功能描述:遍历每一页,按页重新组织clause()返回值为fromq对象。 返回结果:fromq 调用样例:

var paginger = fromq.range(100).paging(5);
paginger.select(function(rdsq,pageNo){
    return {pageNo:pageNo,count:rdsq.count(),sum:rdsq.sum(),avg:rdsq.avg()};
}).each(function(item){
    console.log(item);
});
//for lambda
paginger
    .select("(rdsq,pageNo)=>{pageNo:pageNo,count:rdsq.count(),sum:rdsq.sum(),avg:rdsq.avg()}")
    .each("o=> console.log(o)");

setNextCount

调用格式:setNextCount(/*Number*/count); 功能描述:设置每页的记录数量。 返回结果:null 调用样例:

paginger.setNextCount(10);

pageCount

调用格式:pageCount(); 功能描述:依据每一页的记录数量与缓存的记录数计算总页数。 返回结果:Number>=0 调用样例:

var pageCount = fromq.range(100).paging(6).pageCount();
console.log("page count:",pageCount);

getPageNo

调用格式:getPageNo(/*object*/item); 功能描述:返回item所处页的页码,若item=null | undefined,则返回当前页的页码。 返回结果:Number 调用样例:

var paginger = fromq.range(100).paging(6);
paginger.last();
console.log("Current Page No:",paginger.getPageNo());

isEmpty

调用格式:isEmpty(); 功能描述:判断Paginger的缓存数据是否为空。 返回结果:true|false 调用样例:

var paginger = fromq.range(100).paging(6,"o=>o>100");
console.log("Paginger is empty:",paginger.isEmpty());

getCache

调用格式:getCache(); 功能描述:获取Paginger的缓存数据。 返回结果:fromq 调用样例:

var paginger = fromq.range(100).paging(6,"o=>o%15==0");
console.log("Paginger cache records number:",paginger.getCache().count());

getCacheCount

调用格式:getCacheCount(); 功能描述:获取Paginger的缓存数据的数组长度。 返回结果:fromq 调用样例:

var paginger = fromq.range(100).paging(6,"o=>o%15==0");
console.log("Paginger cache records number:",paginger.getCacheCount());

gotoPage

调用格式:gotoPage(/*Number*/pageNumber); 功能描述:跳转到pageNumber,并获取PageNumber的数据。 返回结果:fromq 调用样例:

var paginger = fromq.range(100).paging(6,"o=>o%3==0");
paginger.
    gotoPage(2)
    .each(function(item){
        console.log("record no.",paginger.indexOf(item),"\tvalue:",item);
    });

first

调用格式:first(); 功能描述:跳转到第一页,并获取该页的数据。 返回结果:fromq 调用样例:

var paginger = fromq.range(100).paging(6,"o=>o%3==0");
paginger
    .first()
    .each(function(item){
        console.log("record no.",paginger.indexOf(item),"\tvalue:",item);
    });

last

调用格式:last(); 功能描述:跳转到末页,并获取该页的数据。 返回结果:fromq 调用样例:

var paginger = fromq.range(100).paging(6,"o=>o%3==0");
paginger
    .last()
    .each(function(item){
        console.log("record no.",paginger.indexOf(item),"\tvalue:",item);
    });

next

调用格式:next(); 功能描述:移到下一页,并获取该页的数据。 返回结果:fromq 调用样例:

var paginger = fromq.range(100).paging(6,"o=>o%3==0");
paginger
    .next()
    .each(function(item){
        console.log("record no.",paginger.indexOf(item),"\tvalue:",item);
    });

prior

调用格式:prior(); 功能描述:移到上一页,并获取该页的数据。 返回结果:fromq 调用样例:

var paginger = fromq.range(100).paging(6,"o=>o%3==0");
paginger
    .prior()
    .each(function(item){
        console.log("record no.",paginger.indexOf(item),"\tvalue:",item);
    });

current

调用格式:current(); 功能描述:获取当前页的数据。 返回结果:fromq 调用样例:

var paginger = fromq.range(100).paging(6,"o=>o%3==0");
paginger
    .current()
    .each(function(item){
        console.log("record no.",paginger.indexOf(item),"\tvalue:",item);
    });

indexOf

调用格式:indexOf(/*Object*/item); 功能描述:获取item在Cache中的索引值。 返回结果:Number

  • 若返回结果为-1,表示item不在Cache中。

调用样例:

var paginger = fromq.range(100).paging(6,"o=>o%3==0");
paginger
    .last()
    .each(function(item){
        console.log("record no.",paginger.indexOf(item),"\tvalue:",item);
    });

isTail

调用格式:isTail(); 功能描述:判断当前页是否是末尾页。 返回结果:true|false 调用样例:

var paginger = fromq.range(100).paging(6,"o=>o%3==0");
paginger.next();
console.
    log("Current Page is tail:",paginger.isTail());
   

isTop

调用格式:isTop(); 功能描述:判断当前页是否是顶页。 返回结果:true|false 调用样例:

var paginger = fromq.range(100).paging(6,"o=>o%3==0");
paginger.first();
console.
    log("Current Page is top:",paginger.isTop());
   

5.正则表达式操作

fromq可以进行正则表达式的匹配操作,主要有两个函数,fromq(RegExp)和match(str)。具体使用详细如下说明。

fromq

调用格式:fromq(/*RegExp*/it,/*String*/str); 功能描述:使用it对str进行正则表达式匹配,组织匹配结果为fromq对象。 返回结果:fromq 调用样例:

fromq(/ab*/g,"abb switch,i like abb").
    each("o=>console.log('value:'+o,'\t index:'+o.index)");

match

调用格式:match(/*String*/str); 功能描述:使用fromq对象创建时的it值对str进行正则表达式匹配,组织匹配结果为fromq对象。 返回结果:fromq 调用样例:

fromq(/ab*/g).match("abb switch,i like abb").
    each("o=>console.log('value:'+o,'\t index:'+o.index)");

6.Lambda使用

fromq | fromq.lambda

调用格式:fromq(/*String*/it,/*Boolean*/isClosure); 功能描述:fromq可以将符合Lambda规范的字符串编译为匿名函数。 返回结果:Function 调用样例:

fromq("o=>console.log(o)");
fromq.lambda("o=>console.log(o)");
fromq("o=>console.log(o)",true); //带有闭包函数体
fromq.lambda("o=>console.log(o)",true);

fromq("o=>console.log(o)").toString();
/*
function anonymous(o) {
'use strict';
return console.log(o);
}
*/

fromq("o=>console.log(o)",true).toString();
/*
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 = fromq.utils.random(100,null,5).toString(",");
console.log(s);
/*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.range(10)
        .select("o=>o*2")
        .each('o=>console.log(o)');
fromq
        .utils.range(5,10)
        .select("o=>o*2")
        .each('o=>console.log(o)');
fromq
        .utils.range(1,10,2)
        .select("o=>o*2")
        .each('o=>console.log(o)');

repeat

调用格式:repeat(/*String*/it, /*Number*/count); 功能描述:重复生成count数量的it数组元素并返回fromq。 返回结果:fromq 调用样例:

fromq
        .utils.repeat("a",4)
        .each('o=>console.log(o)');
/*out:
    aaaa
*/

trim

调用格式:trim(/*String*/it); 功能描述:删除it字符串的前尾空白字符并返回。 返回结果:String 调用样例:

var src = " a ";
console.log(src.length);//3
console.log(fromq.utils.trim(src).length);//1

initialToUpperCase

调用格式:initialToUpperCase(/*String*/it); 功能描述:将字符串中首个单词的首字母转为大写字母。 返回结果:String 调用样例:

var src = " hello world ";
console.log("'",src,"',  length:",src.length);
var dsrc = fromq.utils.initialToUpperCase(src);
console.log("'",dsrc,"',  length:",dsrc.length);
/*out:
' hello world ', length:13
' Hello world ', length:13
*/

initialsToUpperCase

调用格式:initialsToUpperCase(/*String*/it); 功能描述:将字符串中每个单词的首字母转为大写字母。 返回结果:String 调用样例:

var src = " hello world ";
console.log("'",src,"',  length:",src.length);
var dsrc = fromq.utils.initialsToUpperCase(src);
console.log("'",dsrc,"',  length:",dsrc.length);
/*out:
' hello world ', length:13
' Hello World ', length:13
*/

isArray

调用格式:isArray(/*array*/it); 功能描述:判断it是否是数组。 返回结果:true|false 调用样例:

console.log(fromq.utils.isArray([]));  //true

isFunction

调用格式:isFunction(/*Function*/it); 功能描述:判断it是否是函数。 返回结果:true|false 调用样例:

console.log(fromq.utils.isFunction(function(){}));  //true

isString

调用格式:isString(/*String*/it); 功能描述:判断it是否是字符串。 返回结果:true|false 调用样例:

console.log(fromq.utils.isString(" ab "));  //true
console.log(fromq.utils.isString(""));  //true

isNumber

调用格式:isNumber(/*String|Number*/it); 功能描述:判断it是否是整数。 返回结果:true|false 调用样例:

console.log(fromq.utils.isNumber("123"));  //true
console.log(fromq.utils.isNumber(123));  //true
console.log(fromq.utils.isNumber("12.3"));  //false
console.log(fromq.utils.isNumber(12.3));  //false

isFloat

调用格式:isFloat(/*String|Number*/it); 功能描述:判断it是否是实数。 返回结果:true|false 调用样例:

console.log(fromq.utils.isFloat("123"));  //true
console.log(fromq.utils.isFloat(12.3));  //true
console.log(fromq.utils.isFloat("-12.3"));  //true
console.log(fromq.utils.isFloat("+12.3"));  //true