来个linq to js
说这个话题之前,我们来讲一下C#的linq 语法。在C#里面我们会对列表进行操作,如OrderBy(p=>p.property),Where(p=>p.property==..)
括号里面的就是所谓的lamda表达式。下面我们就来实现对js里面对象数组的类似操作。
先说一下思想:
在代码中先用一个占位符替代,最后动态的替代占位符express,然后将替代占位符后的函数的字符窜代码用eval()执行一下,成为一个有效的函数。
代码如下:
var query = function (exp, isAsc) {
var isArray = function (queryArr) {
return Object.prototype.toString.call(queryArr) == "[object Array]";
};
var whereTemplete = function (queryArr) {
var arr = [];
if (isArray(queryArr)) {
for (var i = ; i < queryArr.length; i++) {
var e = queryArr[i];
if (express) {
arr.push(e);
}
}
}
return arr;
};
var orderTemplete = {
orderAscTemplete: function (queryArr) {
var temp = {};
var arr = queryArr;
if (isArray(arr)) {
for (var i = ; i < arr.length; i++) {
for (var k = ; k < arr.length; k++) {
if (arr[i]['express'] < arr[k]['express']) {
temp = arr[i]
arr[i] = arr[k];
arr[k] = temp;
}
}
}
}
return arr;
},
orderDescTemplete: function (queryArr) {
var temp = {};
var arr = queryArr;
if (isArray(arr)) {
for (var i = ; i < arr.length; i++) {
for (var k = ; k < arr.length; k++) {
if (arr[i]['express'] > arr[k]['express']) {
temp = arr[i]
arr[i] = arr[k];
arr[k] = temp;
}
}
}
}
return arr;
}
};
var hasOper = exp.indexOf('>' | '=' | '<');
var str = hasOper >=
? whereTemplete.toString().replace('express', exp)
: (
isAsc
? orderTemplete.orderAscTemplete.toString().replace(/express/g, exp.replace('e.', ''))
: orderTemplete.orderDescTemplete.toString().replace(/express/g, exp.replace('e.', ''))
);
return eval('0,' + str);
}
Array.prototype.Query = function () {
var self = this;
return arguments.length ==
? (new query(arguments[])(self))
: (new query(arguments[], arguments[])(self));
}
代码不难,大家是可以看懂的,慢慢体会一下,没什么要讲解的地方。
唯一的就是大家要对原型要有一定的了解。
然后说一下调用的具体方法:
var arr = [{ name: 'aaa', grade: 90 }, { name: 'ccc', grade: 70 }, { name: 'bbb', grade: 80 }];
//var filterArr = arr.Query("e.grade", false); 实现排序
var filterArr = arr.Query('e.grade>80');//实现过滤
for (var i = 0; i < filterArr.length; i++) {
document.writeln(filterArr[i].name);
}
来个linq to js的更多相关文章
- JS系列——Linq to js使用小结
前言:前面几篇介绍了下C#基础技术中的几个:反射.特性.泛型.序列化.扩展方法.Linq to Xml等,本来还有两三个知识点没有写完,比如委托.多线程.异步等,后面会陆续将它们补起来,以便作为一套完 ...
- linq to js使用汇总
用途:方便js操作查询json数据. 下载网址:http://jslinq.codeplex.com/ 使用方法:只需要引用linq.js即可. 查询方法: 一.where查询 var myList ...
- linq to js 用法
/** * 排序汇总 * */ var result = Enumerable.From(vm.productList).GroupBy("$.goods_id", null, f ...
- 【JavaScript】又一神器框架:linq.js
引言 前几天针对一个js数组交集的问题请教了下同事,他第一反应就是循环,这也是常规思路,因为我个人更倾向于js些,我便开玩笑,不知道js能不能像linq那样实现这些操作呢?果断百度了一把,果然有现成框 ...
- 使用Js进行linq处理
需要引用的文件 <script src="~/js/linq/jquery.linq-vsdoc.js"></script><script src=& ...
- 数组插件----linq.js
优点 1.支持jQuery插件的方式.jquery.linq.min.js. 2.也可以像普通js方法一样使用.linq.min.js. 3.当然用习惯VS的童鞋肯定希望有个良好的智能感知,是的,它支 ...
- 又一神器框架:linq.js
1.支持jQuery插件的方式.jquery.linq.min.js. 2.也可以像普通js方法一样使用.linq.min.js. 3.当然用习惯VS的童鞋肯定希望有个良好的智能感知,是的,它支持. ...
- JS组件系列——自己动手封装bootstrap-treegrid组件
前言:最近产品需要设计一套相对完整的组织架构的解决方案,由于组织架构涉及到层级关系,在表格里面展示层级关系,自然就要用到所谓的treegrid.可惜的是,一些轻量级的表格组件本身并没有自带树形表格的功 ...
- 仿京东淘宝商品详情页属性选择js效果
在网上找了好久发现都不符合要求就自己摸索写了一个,用到了linq.js这个linq to js 扩展,不然用纯JS遍历json查询要死人啊 demo:http://123.207.28.46:8086 ...
随机推荐
- Linux IPC socket编程基础
头文件 #include<unistd.h> #include <sys/types.h> #include <sys/socket.h> #include< ...
- android 滑动滚动条调节音量
利用滚动条滑动控制音量: 定义: private SeekBar mseekBarvolume: 以下实现代码: //调节音量--begin------------------------- //音量 ...
- 关于TreeView的选中事件
在使用TreeView的选中事件时,发现,SelectAfter在第一次选中时触发,你再次点击时这个事件并不能引发它.所以找了找,发现有另两种解决办法. 最好的就是使用:NodeMouseClick, ...
- 必须知道的八大种排序算法【java实现】(三) 归并排序算法、堆排序算法详解
一.归并排序算法 基本思想: 归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的.然后再把有序子序列合并为整体有序序列. 归并 ...
- 学习OpenStack之 (3):Devstack Screen 使用技巧
Devstack环境中,openstack运行在一个screen中,每个service运行在一个window中.我总结的几个tips: 0. 注意需要使用screen启动用户来进行一下操作 1. 查看 ...
- 准备使用 Office 365 中国版--安装
温故而知新,先附上一个链接:Office 365常见问题 Office 365中Office套件的安装介质和传统Office套件的安装介质是有些区别的,虽然功能都一样.因此,如果购买了带Office套 ...
- css实现一个写信的格式
一.目标 目标实现如下效果: 二.完成 1.分析 这个效果看起来很简单,实际上可能并不那么容易实现. 首先是全部东西都居中显示,除了“亲爱的starof”这个称呼的地方.这也是难点,也是本文要重点说的 ...
- [转]C#编程总结(三)线程同步
本文转自:http://www.cnblogs.com/yank/p/3227324.html 在应用程序中使用多个线程的一个好处是每个线程都可以异步执行.对于 Windows 应用程序,耗时的任务可 ...
- IDEA使用(1)intellIJ idea 配置 svn
以前开发工具一直用的是Eclipse/MyEclipse,虽然早就听说过Idea而且也尝试用过几次, 说实话一开始使用idea真是很不习惯,不只是快捷键不同:比如项目和模块.服务器(如Tomcat)配 ...
- [Top-Down Approach] Chatper 4 Notes
4.2 Virtual Circuit and Datagram Networks VC Set up connection Exchange data Free the connection The ...