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 相关文章推荐
html中table数据排序的js代码
Aug 09 Javascript
JavaScript获取图片的原始尺寸以宽度为例
May 04 Javascript
使用jQuery mobile库检测url绝对地址和相对地址的方法
Dec 04 Javascript
jQuery中fadein与fadeout方法用法示例
Sep 16 Javascript
简单的渐变轮播插件
Jan 12 Javascript
javascript事件的传播基础实例讲解(35)
Feb 14 Javascript
基于JavaScript定位当前的地理位置
Apr 11 Javascript
基于vue中keep-alive缓存问题的解决方法
Sep 21 Javascript
利用Angular2的Observables实现交互控制的方法
Dec 27 Javascript
validform表单验证的实现方法
Mar 08 Javascript
javascript实现的时间格式加8小时功能示例
Jun 13 Javascript
webpack DllPlugin xxx is not defined解决办法
Dec 13 Javascript
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
用libTemplate实现静态网页的生成
2006/10/09 PHP
利用PHP创建动态图像
2006/10/09 PHP
黑夜路人出的几道php笔试题
2009/08/04 PHP
PHP给源代码加密的几种方法汇总(推荐)
2018/02/06 PHP
基于PHP+mysql实现新闻发布系统的开发
2020/08/06 PHP
JavaScript 撑出页面文字换行
2009/06/15 Javascript
密码强度检测效果实现原理与代码
2013/01/04 Javascript
jquery获取tr中控件值并操作tr实现思路
2013/03/27 Javascript
随鼠标上下滚动的jquery代码
2013/12/05 Javascript
js防止DIV布局滚动时闪动的解决方法
2014/10/30 Javascript
jQuery绑定事件on()与弹窗的简要概述
2016/04/27 Javascript
js仿淘宝和百度文库的评分功能
2016/05/15 Javascript
javascript基础知识
2016/06/07 Javascript
JavaScript中两个字符串的匹配
2016/06/08 Javascript
NodeJs安装npm包一直失败的解决方法
2017/04/28 NodeJs
解决vue-router路由拦截造成死循环问题
2020/08/05 Javascript
js实现头像上传并且可预览提交
2020/12/25 Javascript
线程和进程的区别及Python代码实例
2015/02/04 Python
python检测远程服务器tcp端口的方法
2015/03/14 Python
Django框架中方法的访问和查找
2015/07/15 Python
Python脚本实现自动发带图的微博
2016/04/27 Python
10分钟教你用Python实现微信自动回复功能
2018/11/28 Python
python多线程调用exit无法退出的解决方法
2019/02/18 Python
Python完成哈夫曼树编码过程及原理详解
2019/07/29 Python
Python Print实现在输出中插入变量的例子
2019/12/25 Python
Pytorch 使用CNN图像分类的实现
2020/06/16 Python
python tqdm实现进度条的示例代码
2020/11/10 Python
python中pop()函数的语法与实例
2020/12/01 Python
英国最大的电子产品和家电零售企业:Currys PC World
2016/09/24 全球购物
TUMI新加坡官网:国际领先的商旅箱包品牌
2019/01/12 全球购物
标准毕业生自荐信范文
2013/11/04 职场文书
党支部对照检查材料
2014/08/25 职场文书
党员群众路线个人整改措施思想汇报
2014/10/12 职场文书
2017寒假社会实践心得体会范文
2016/01/14 职场文书
Java日常练习题,每天进步一点点(38)
2021/07/26 Java/Android
奥特曼十大神器:奥特手镯在榜,第一是贝利亚的神器
2022/03/18 日漫