JS 实现Json查询的方法实例
其实很简单,我这部分代码,前一部分是简单的实现如何使用JS写模板,第二个就是具体的实现了JSON查询的一个扩展。
以后查询Json就有了利器了。
代码如下:
* 定义模板函数
*/
var template = function (queryArr) {
var count = 0;
for (var i = 0; i < queryArr.length; i++) {
var e = queryArr[i];
if ($express) {
count++;
}
}
return count;
}
/*
* 模板创建函数
*/
var createIntance = function (exp) {
var fun = template.toString().replace("$express", exp).toString();
return eval("0," + fun);
}
var testTodo = function () {
var testArr = [
{ name: "张三", age: 20 },
{ name: "李四", age: 25 },
{ name: "王二麻子", age: 28 },
{ name: "小张", age: 30 }
];
var func = createIntance("e.age>=25");
alert(func(testArr));
}
/****************** JS 实现 JSON查询 **********************/
// 定义常用的函数
var len = function (s) { return s.length; }
var left = function (s, n) { return s.substr(0, n); }
var right = function (s, n) { return s.substr(-n); }
var index = function (s, find) { return s.indexOf(find) + 1; }
// 扩展原型方法
var _proto = Object.prototype;
// 缓存,解决快速查找
var _cache = {};
// 扩展运算符
var _alias = [
/@/g, "_e.",
/AND/gi, "&&",
/OR/gi, "||",
/<>/g, "!=",
/NOT/gi, "!",
/([^=<>])=([^=]|$)/g, '$1==$2'
];
var _rQuote = /""/g;
var _rQuoteTemp = /!~/g;
// 编译
var _complite = function (code) {
return eval("0," + code);
}
// 将扩展符号转换成标准的JS符号
var _interpret = function (exp) {
exp = exp.replace(_rQuote,"!~");
var arr = exp.split('"');
var i, n = arr.length;
var k = _alias.length;
for (var i = 0; i < n; i += 2) {
var s = arr[i];
for (var j = 0; j < k; j += 2) {
if (index(s, _alias[j]) > -1) {
s = s.replace(_alias[j], _alias[j + 1]);
}
}
arr[i] = s;
}
for (var i = 1; i < n; i += 2) {
arr[i] = arr[i].replace(_rQuoteTemp, '\\"');
}
return arr.join('"');
}
// 定义模函数
var _templ = function (_list) {
var _ret = [];
var _i = -1;
for (var _k in _list) {
var _e = _list[_k];
if (_e != _proto[_k]) {
if ($C) {
_ret[++_i] = _e;
}
}
}
return _ret;
} .toString();
// 扩展查询的方法
_proto.Query = function (exp) {
if (!exp) {
return [];
}
var fn = _cache[exp];
try {
if (!fn) {
var code = _interpret(exp);
code = _templ.replace("$C", code);
fn = _cache[exp] = _complite(code);
}
return fn(this);
} catch (e) {
return [];
}
}
var doTest = function () {
var heros = [
// 名============攻=====防=======力量====敏捷=====智力====
{name: '冰室女巫', DP: 38, AP: 1.3, Str: 16, Dex: 16, Int: 21 },
{ name: '沉默术士', DP: 39, AP: 1.1, Str: 17, Dex: 16, Int: 21 },
{ name: '娜迦海妖', DP: 51, AP: 6.0, Str: 21, Dex: 21, Int: 18 },
{ name: '赏金猎人', DP: 39, AP: 4.0, Str: 17, Dex: 21, Int: 16 },
{ name: '剧毒术士', DP: 45, AP: 3.1, Str: 18, Dex: 22, Int: 15 },
{ name: '光之守卫', DP: 38, AP: 1.1, Str: 16, Dex: 15, Int: 22 },
{ name: '炼金术士', DP: 49, AP: 0.6, Str: 25, Dex: 11, Int: 25 }
//...
];
var match = heros.Query('@Str>20 AND @Dex>20');
ShowResult(match[0]);
// 查询:“士”结尾的
// 结果:沉默术士,剧毒术士,炼金术士
var match = heros.Query('right(@name,1)="士"');
ShowResult(match[0]);
}
function ShowResult(result) {
alert(result.name + " " + result.DP + " " + result.AP + " " + result.Str + " " + result.Dex + " " + result.Int);
}
JS 实现Json查询的方法实例的更多相关文章
- js获取IP地址多种方法实例教程
js获取IP地址方法总结 js代码获取IP地址的方法,如何在js中取得客户端的IP地址.原文地址:js获取IP地址的三种方法 http://www.jbxue.com/article/11338. ...
- js解析Json字符串的方法
要把一个xml字符串转(“1,2,3,4,5,6,7,8,1,2”)换成数组的形式,每个值都应该是number类型的,想当然的就用了split方法,结果...问题来了,服务器要求数组的值是数字,而 ...
- js便利json 数组的方法
这篇文章主要介绍了JQuery遍历json数组的3种方法,本文分别给出了使用each.for遍历json的方法,其中for又分成两种形式,需要的朋友可以参考下 $(function () { var ...
- JS数组(JSON)整合篇-方法整理
遍历:arr_Param.forEach(function (item, i) {}); 反序排序:arr_Param.reverse(); 合并数组:arr_Param.push.apply(arr ...
- JS数组添加字典的方法
var ary_RoleType = []; //申明数组变量 for(var j = 0;j<treeData.length;j++){ if($.inArray(treeData[j].v ...
- Js拼Json对象
我们通常会拼字符串,但是拼字符串的话,遇见占位符会出错. 下面分享一个拼js拼json对象的方法: var jsonArr = []; $ ...
- js读取json数据(php传值给js)
<?php $array =array('fds','fdsa','fdsafasd'); // json_encode($array); ?> <html> <hea ...
- js获取url传值的方法
这篇文章主要介绍了js获取url传值的方法,实例分析了字符串分割与正则分析两种方法,并补充了一个基于正则匹配实现的js获取url的get传值函数,需要的朋友可以参考下 js获取url参数值: inde ...
- js格式化JSON数据
前言: 最近做的项目中遇到个需要在前端页面中将某个设备需要的数据格式展示出来,方便用户配置.一开始单纯的将数据格式写入到pre标签中, 但是通过pre标签写入的数据格式在代码可视化上不是很优雅.由于上 ...
随机推荐
- JS Web的Flex弹性盒子模型
1. justify-content <!DOCTYPE html> <html lang="en"> <head> <meta char ...
- Angular 4 投影
1.创建工程 ng new demo4 2. 创建子组件 ng g component child 3.子组件html定义 <div class="wrapper"> ...
- nginx负载
一. Nginx反向代理与负载均衡概念简介 • 严格地说,Nginx仅仅是作为Nginx Proxy反向代理使用的,因为这个反向代理功能表现的效果是负载均衡集群的效果,所以本文称之为Nginx负载均衡 ...
- SpringCloud使用jpa之Rest方式
这个与上一篇的基本相同,需要修改的只有Dao层的文件: TablesDao.java package com.shinho.dao; import org.springframework.data.j ...
- 【Spring学习笔记-MVC-3】SpringMVC返回Json数据-方式1
<Spring学习笔记-MVC>系列文章,讲解返回json数据的文章共有3篇,分别为: [Spring学习笔记-MVC-3]SpringMVC返回Json数据-方式1:http://www ...
- Qt 常用类——QStandardItemModel
转载:落叶知秋时 类QabstractItemModel,QabstractListModel,QAbstractTableModel不保存数据,用户需要从这些类派生出子类,并在子类中定义某种数据结构 ...
- 解决Qt Creator下 undefined reference to 'qmain(int,char**)'的问题
Qt Creator运行以下程序: #include <QTextStream> #include <QList> int main(void) { QTextStream o ...
- 第5章 pandas入门
pandas是专门为处理表格和混杂数据设计的,NumPy更适合处理统一的数值数组数据. pandas的数据结构: Series:Series是一种类似于一维数组的对象,它由一组数据(各种NumPy数据 ...
- 设置redis 密码
redis配置密码 1.通过配置文件进行配置 yum方式安装的redis配置文件通常在/etc/redis.conf中,打开配置文件找到 [plain] view plain copy require ...
- javascript事件处理程序的3个阶段
第一阶段:HTML事件处理阶段.就是在元素里面添加onclick之类的属性来调用某个函数. <input type="button" value="单击" ...