又或者对数组里的类容求和求平均数之类的一般的做法是循环里面的类容做判断添加到一个新的集合里
复制代码
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 list = new List();
a.Add(1);
a.Add(2);
a.Add(3);
a.Add(4);
a.Add(5);
a.Add(6);
List copyList = list.Where(model => model < 3);
复制代码
拿
JavaSctipt 能不能做出一个跟System.Linq.Enumerable 差不多一样的扩展类来了答案是能的我们来定义一段如下的
java script脚本
复制代码
Array.prototype.Where = function (func) {
var copy = [];
for (var model in this) {
try {
if (func(model)) {
copy.push(model);
}
}
catch (ex) { }
}
}
复制代码
把它放在页面顶部我们会惊喜的发现 Array 多了一个Where方法 java script 每个类的方法都会在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的文件拖到页面上 每次就都能使用这些扩展方法了