JS 实现Json查询的方法实例


Posted in Javascript onApril 12, 2013

     其实很简单,我这部分代码,前一部分是简单的实现如何使用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);
        }

     代码就是这样了。欢迎大家拍砖,或者可以提出新的想法。我们一起来扩展
Javascript 相关文章推荐
Add a Table to a Word Document
Jun 15 Javascript
jQuery入门问答 整理的几个常见的初学者问题
Feb 22 Javascript
JAVASCRIPT车架号识别/验证函数代码 汽车车架号验证程序
Jan 08 Javascript
获取div编辑框,textarea,input text的光标位置 兼容IE,FF和Chrome的方法介绍
Nov 08 Javascript
引用其它js时如何同时处理多个window.onload事件
Sep 02 Javascript
JavaScript中的console.assert()函数介绍
Dec 29 Javascript
运用jQuery写的验证表单(实例讲解)
Jul 06 jQuery
vue组件父子间通信详解(三)
Nov 07 Javascript
深入理解JavaScript 中的执行上下文和执行栈
Oct 23 Javascript
Node.js 的 GC 机制详解
Jun 03 Javascript
详细聊聊浏览器是如何看闭包的
Nov 11 Javascript
Vue.js中v-for指令的用法介绍
Mar 13 Vue.js
js弹出层(jQuery插件形式附带reLoad功能)
Apr 12 #Javascript
location对象的属性和方法应用(解析URL)
Apr 12 #Javascript
图片轮换效果实现代码(点击按钮停止执行)
Apr 12 #Javascript
Javascript的时间戳和php的时间戳转换注意事项
Apr 12 #Javascript
有关javascript的性能优化 (repaint和reflow)
Apr 12 #Javascript
引用外部js乱码问题分析及解决方案
Apr 12 #Javascript
关于query Javascript CSS Selector engine
Apr 12 #Javascript
You might like
用php解析html的实现代码
2011/08/08 PHP
PHP echo,print,printf,sprintf函数之间的区别与用法详解
2013/11/27 PHP
解决PHP 7编译安装错误:cannot stat ‘phar.phar’: No such file or directory
2017/02/25 PHP
Javascript 陷阱 window全局对象
2008/11/26 Javascript
不同浏览器对回车提交表单的处理办法
2010/02/13 Javascript
浅析jquery的js图表组件highcharts
2014/03/06 Javascript
jquery中change()用法实例分析
2015/02/06 Javascript
jquery插件NProgress.js制作网页加载进度条
2015/06/05 Javascript
谈谈基于iframe、FormData、FileReader三种无刷新上传文件的方法
2015/12/03 Javascript
给before和after伪元素设置js效果的方法
2015/12/04 Javascript
mvvm双向绑定机制的原理和实现代码(推荐)
2016/06/07 Javascript
JavaScript实现水平进度条拖拽效果
2017/01/18 Javascript
JavaScript 上传文件(psd,压缩包等),图片,视频的实现方法
2017/06/19 Javascript
vue+vux实现移动端文件上传样式
2017/07/28 Javascript
vue几个常用跨域处理方式介绍
2018/02/07 Javascript
如何利用@angular/cli V6.0直接开发PWA应用详解
2018/05/06 Javascript
React key值的作用和使用详解
2018/08/23 Javascript
[04:11]DOTA2上海特级锦标赛主赛事首日TOP10
2016/03/03 DOTA
[32:47]完美世界DOTA2联赛 GXR vs IO 第二场 11.07
2020/11/09 DOTA
[36:16]完美世界DOTA2联赛PWL S3 access vs Rebirth 第一场 12.19
2020/12/24 DOTA
python uuid模块使用实例
2015/04/08 Python
详解C++编程中一元运算符的重载
2016/01/19 Python
python通过百度地图API获取某地址的经纬度详解
2018/01/28 Python
详解pandas库pd.read_excel操作读取excel文件参数整理与实例
2019/02/17 Python
使用Python检测文章抄袭及去重算法原理解析
2019/06/14 Python
Canvas绘制浮动球效果的示例
2017/12/29 HTML / CSS
Tuckernuck官网:经典的美国品质服装、鞋子和配饰
2021/01/11 全球购物
.NET笔试题(20个问题)
2016/02/02 面试题
名词解释型面试题(主要是网络)
2013/12/27 面试题
会计找工作求职信范文
2013/12/09 职场文书
网络编辑岗位职责范本
2014/02/10 职场文书
教师求职信怎么写
2015/03/20 职场文书
关于召开会议的通知
2015/04/15 职场文书
高考1977观后感
2015/06/04 职场文书
python中出现invalid syntax报错的几种原因分析
2022/02/12 Python
Sql Server之数据类型详解
2022/02/28 SQL Server