记录一下,方便自己查找。。。

自己在开发前端时,对于处理JSON,觉得真是枯燥。处理数据,基本都要循环。 所以我想着前端也能跟后端一样,有Linq来处理我的JSON对象就好了。上网一搜,找到了JSLINQ.js。。实现了自己的需求,嘿嘿嘿。

首先是JSLINQ.js 代码。 下载地址

自己贴一下:

//-----------------------------------------------------------------------
// Part of the LINQ to JavaScript (JSLINQ) v2.20 Project - http://jslinq.codeplex.com
// Copyright (C) 2012 Chris Pietschmann (http://pietschsoft.com). All rights reserved.
// This license can be found here: http://jslinq.codeplex.com/license
//-----------------------------------------------------------------------
(function () {
var JSLINQ = window.jslinq = window.JSLINQ = function (dataItems) {
return new JSLINQ.fn.init(dataItems);
},
utils = {
processLambda: function (clause) {
// This piece of "handling" C#-style Lambda expression was borrowed from:
// linq.js - LINQ for JavaScript Library - http://lingjs.codeplex.com
// THANK!!
if (utils.isLambda(clause)) {
var expr = clause.match(/^[(\s]*([^()]*?)[)\s]*=>(.*)/);
return new Function(expr[1], "return (" + expr[2] + ")");
}
return clause;
},
isLambda: function (clause) {
return (clause.indexOf("=>") > -1);
},
randomIndex: function (max, existing) {
var q, r, f = function () { return this == r; };
if (!existing) {
return parseInt(Math.random() * max, 10);
} else {
q = JSLINQ(existing);
r = -1;
while (r < 0 || q.Where(f).Count() !== 0) {
r = utils.randomIndex(max);
}
return r;
}
}
};
JSLINQ.fn = JSLINQ.prototype = {
init: function (dataItems) {
this.items = dataItems;
}, // The current version of JSLINQ being used
jslinq: "2.20", toArray: function () { return this.items; },
where: function (clause) {
var newArray = [], len = this.items.length; // The clause was passed in as a Method that return a Boolean
for (var i = 0; i < len; i++) {
if (clause.apply(this.items[i], [this.items[i], i])) {
newArray[newArray.length] = this.items[i];
}
}
return JSLINQ(newArray);
},
select: function (clause) {
var item, newArray = [], field = clause;
if (typeof (clause) !== "function") {
if (clause.indexOf(",") === -1) {
clause = function () { return this[field]; };
} else {
clause = function () {
var i, fields = field.split(","), obj = {};
for (i = 0; i < fields.length; i++) {
obj[fields[i]] = this[fields[i]];
}
return obj;
};
}
} // The clause was passed in as a Method that returns a Value
for (var i = 0; i < this.items.length; i++) {
item = clause.apply(this.items[i], [this.items[i]]);
if (item) {
newArray[newArray.length] = item;
}
}
return JSLINQ(newArray);
},
orderBy: function (clause) {
var tempArray = [];
for (var i = 0; i < this.items.length; i++) {
tempArray[tempArray.length] = this.items[i];
} if (typeof (clause) !== "function") {
var field = clause;
if (utils.isLambda(field)) {
clause = utils.processLambda(field);
}
else {
clause = function () { return this[field]; };
}
} return JSLINQ(
tempArray.sort(function (a, b) {
var x = clause.apply(a, [a]), y = clause.apply(b, [b]);
return ((x < y) ? -1 : ((x > y) ? 1 : 0));
})
);
},
orderByDescending: function (clause) {
var tempArray = [], field;
for (var i = 0; i < this.items.length; i++) {
tempArray[tempArray.length] = this.items[i];
} if (typeof (clause) !== "function") {
field = clause;
if (utils.isLambda(field)) {
clause = utils.processLambda(field);
}
else {
clause = function () { return this[field]; };
}
} return JSLINQ(tempArray.sort(function (a, b) {
var x = clause.apply(b, [b]), y = clause.apply(a, [a]);
return ((x < y) ? -1 : ((x > y) ? 1 : 0));
}));
},
selectMany: function (clause) {
var r = [];
for (var i = 0; i < this.items.length; i++) {
r = r.concat(clause.apply(this.items[i], [this.items[i]]));
}
return JSLINQ(r);
},
count: function (clause) {
if (clause === undefined) {
return this.items.length;
} else {
return this.Where(clause).items.length;
}
},
distinct: function (clause) {
var item, dict = {}, retVal = [];
for (var i = 0; i < this.items.length; i++) {
item = clause.apply(this.items[i], [this.items[i]]);
// TODO - This doesn't correctly compare Objects. Need to fix this
if (dict[item] === undefined) {
dict[item] = true;
retVal.push(item);
}
}
dict = null;
return JSLINQ(retVal);
},
any: function (clause) {
for (var i = 0; i < this.items.length; i++) {
if (clause.apply(this.items[i], [this.items[i], i])) { return true; }
}
return false;
},
all: function (clause) {
for (var i = 0; i < this.items.length; i++) {
if (!clause(this.items[i], i)) { return false; }
}
return true;
},
reverse: function () {
var retVal = [];
for (var i = this.items.length - 1; i > -1; i--) {
retVal[retVal.length] = this.items[i];
}
return JSLINQ(retVal);
},
first: function (clause) {
if (clause !== undefined) {
return this.Where(clause).First();
}
else {
// If no clause was specified, then return the First element in the Array
if (this.items.length > 0) {
return this.items[0];
} else {
return null;
}
}
},
last: function (clause) {
if (clause !== undefined) {
return this.Where(clause).Last();
}
else {
// If no clause was specified, then return the First element in the Array
if (this.items.length > 0) {
return this.items[this.items.length - 1];
} else {
return null;
}
}
},
elementAt: function (i) {
return this.items[i];
},
concat: function (array) {
var arr = array.items || array;
return JSLINQ(this.items.concat(arr));
},
intersect: function (secondArray, clause) {
var clauseMethod, sa = (secondArray.items || secondArray), result = [];
if (clause !== undefined) {
clauseMethod = clause;
} else {
clauseMethod = function (item, index, item2, index2) { return item === item2; };
} for (var a = 0; a < this.items.length; a++) {
for (var b = 0; b < sa.length; b++) {
if (clauseMethod(this.items[a], a, sa[b], b)) {
result[result.length] = this.items[a];
}
}
}
return JSLINQ(result);
},
defaultIfEmpty: function (defaultValue) {
if (this.items.length === 0) {
return defaultValue;
}
return this;
},
elementAtOrDefault: function (i, defaultValue) {
if (i >= 0 && i < this.items.length) {
return this.items[i];
}
return defaultValue;
},
firstOrDefault: function (defaultValue) {
return this.First() || defaultValue;
},
lastOrDefault: function (defaultValue) {
return this.Last() || defaultValue;
},
take: function (count) {
return this.Where(function (item, index) { return index < count; });
},
skip: function (count) {
return this.Where(function (item, index) { return index >= count; });
},
each: function (clause) {
var len = this.items.length;
for (var i = 0; i < len; i++) {
clause.apply(this.items[i], [this.items[i], i]);
}
return this;
},
random: function (count) {
var len = this.Count(), rnd = [];
if (!count) { count = 1; }
for (var i = 0; i < count; i++) {
rnd.push(utils.randomIndex(len - 1, rnd));
}
rnd = JSLINQ(rnd);
return this.Where(function (item, index) {
return rnd.Where(function () {
return this == index;
}).Count() > 0;
});
}
}; (function (fn) {
fn.ToArray = fn.toArray;
fn.Where = fn.where;
fn.Select = fn.select;
fn.OrderBy = fn.orderBy;
fn.OrderByDescending = fn.orderByDescending;
fn.SelectMany = fn.selectMany;
fn.Count = fn.count;
fn.Distinct = fn.distinct;
fn.Any = fn.any;
fn.All = fn.all;
fn.Reverse = fn.reverse;
fn.First = fn.first;
fn.Last = fn.last;
fn.ElementAt = fn.elementAt;
fn.Concat = fn.concat;
fn.Intersect = fn.intersect;
fn.DefaultIfEmpty = fn.defaultIfEmpty;
fn.ElementAtOrDefault = fn.elementAtOrDefault;
fn.FirstOrDefault = fn.firstOrDefault;
fn.LastOrDefault = fn.lastOrDefault;
fn.Take = fn.take;
fn.Skip = fn.skip;
fn.Each = fn.each;
fn.Random = fn.random;
})(JSLINQ.fn); JSLINQ.fn.init.prototype = JSLINQ.fn;
})();

使用方式:

页面代码

<!DOCTYPE html>

<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>LinqToJS</title>
<script src="~/Scripts/JSLINQ.js"></script>
<script src="~/Scripts/jquery-1.6.2.min.js"></script>
</head>
<body>
<div>
<h3>linq to js</h3>
</div>
</body>
</html>
<script type="text/javascript">
$(function() {
var str = "{\"zhang\":[{\"name\":\"张大佛爷\",\"Age\":\"170\",\"sex\":\"男\"},{\"name\":\"张启灵\",\"Age\":\"100\",\"sex\":\"男\"}],\"wu\":[{\"name\":\"吴邪\",\"Age\":\"25\",\"sex\":\"男\"}]}";
var list = JSON.parse(str); var sample1 = JSLINQ(list.zhang).Where(function () { return this.name == '张大佛爷'; }); var sample2 = JSLINQ(list.zhang).Select(function () { return this.name; }); return sample1; })
</script>

效果:就跟LINQ一样,没啥好说的,看一下方法格式就行

sample1 sample2

LIINQ TO JS的更多相关文章

  1. Vue.js 和 MVVM 小细节

    MVVM 是Model-View-ViewModel 的缩写,它是一种基于前端开发的架构模式,其核心是提供对View 和 ViewModel 的双向数据绑定,这使得ViewModel 的状态改变可以自 ...

  2. js学习笔记:操作iframe

    iframe可以说是比较老得话题了,而且网上也基本上在说少用iframe,其原因大致为:堵塞页面加载.安全问题.兼容性问题.搜索引擎抓取不到等等,不过相对于这些缺点,iframe的优点更牛,跨域请求. ...

  3. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

  4. JS调用Android、Ios原生控件

    在上一篇博客中已经和大家聊了,关于JS与Android.Ios原生控件之间相互通信的详细代码实现,今天我们一起聊一下JS调用Android.Ios通信的相同点和不同点,以便帮助我们在进行混合式开发时, ...

  5. jquery和Js的区别和基础操作

    jqery的语法和js的语法一样,算是把js升级了一下,这两种语法可以一起使用,只不过是用jqery更加方便 一个页面想要使用jqery的话,先要引入一下jqery包,jqery包从网上下一个就可以, ...

  6. 利用snowfall.jquery.js实现爱心满屏飞

    小颖在上一篇一步一步教你用CSS画爱心中已经分享一种画爱心的方法,这次再分享一种方法用css画爱心,并利用snowfall.jquery.js实现爱心满屏飞的效果. 第一步: 利用伪元素before和 ...

  7. node.js学习(三)简单的node程序&&模块简单使用&&commonJS规范&&深入理解模块原理

    一.一个简单的node程序 1.新建一个txt文件 2.修改后缀 修改之后会弹出这个,点击"是" 3.运行test.js 源文件 使用node.js运行之后的. 如果该路径下没有该 ...

  8. JS正则表达式常用总结

    正则表达式的创建 JS正则表达式的创建有两种方式: new RegExp() 和 直接字面量. //使用RegExp对象创建 var regObj = new RegExp("(^\\s+) ...

  9. 干货分享:让你分分钟学会 JS 闭包

    闭包,是 Javascript 比较重要的一个概念,对于初学者来讲,闭包是一个特别抽象的概念,特别是ECMA规范给的定义,如果没有实战经验,很难从定义去理解它.因此,本文不会对闭包的概念进行大篇幅描述 ...

随机推荐

  1. redis以服务模式开机启动

    第一步 修改redis为后台启动 vim /usr/redis/redis.conf #路径根据实际情况决定 # By default Redis does not run as a daemon. ...

  2. reduce()、filter()、map()、some()、every()、...展开属性

    reduce().filter().map().some().every()....展开属性   这些概念属于es5.es6中的语法,跟react+redux并没有什么联系,我们直接在https:// ...

  3. 类的始祖Object

    一.概述 Object时java中顶级父类,也是唯一没有父类的类:它是整个java中最基本的类,在java中所有的类都默认继承了Object. 二.重要方法 1.clone方法 克隆出一个新的对象. ...

  4. linux系统pid的最大值研究

    内核源码探查 通过对linux内核源码的追踪,可以看到对pid最大值的限定最终集中到include/linux/threads.h文件中的PID_MAX_DEFAULT上了,代码如下: /* * Th ...

  5. 【剑指Offer】面试题18. 删除链表的节点

    题目 给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点. 返回删除后的链表的头节点. 注意:此题对比原题有改动 示例 1: 输入: head = [4,5,1,9], val = 5 ...

  6. CodeForces - 404B Marathon(精度)

    题意:一个人绕着一个长度为a的正方形逆时针跑,以(0,0)为起点,喝一次水可以跑d米,问每喝一次水可以跑到的位置坐标. 分析:这道题卡精度卡的太厉害了. 设l是正方形的周长,只有d对l取余且每次跑d米 ...

  7. cf 755D. PolandBall and Polygon

    题意:把一个多边形往里面连对角线,然后问每次添加多边形被划分为几个部分 产生的部分就是新加对角线与原有对角线相交条数+1,用线段树(大雾)维护一下. #include<bits/stdc++.h ...

  8. 前台图片Canvas压缩上传小结

    需求来源:之前有个提交审核表单的业务,表单中含有大量附件图片,大约有20多张吧,为了省事,采用的同步上传,一次需要上传很多照片,本来单张图片限制为200KB,这样子总图片大小约为5MB左右,想想也可以 ...

  9. 留学Essay写作做到精准表达很关键

    很多留学生在essay写作中可以迅速想到合理的中文论点.可是,写出来的英文论点却漏洞百出,不忍直视.在essay写作中我们要如何精准地用英文写出自己内心的独白呢?除了咨询老师,靠自己一样能做到! 1引 ...

  10. bugku-Web flag.php

    打开网页发现并没有什么,试了很多次没用. 其实题目中提示了hint,我们就传递一个hint=1试试,发现出现了代码: <?php error_reporting(0); include_once ...