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 相关文章推荐
javascript面向对象编程(一) 实例代码
Jun 25 Javascript
原生JS实现响应式瀑布流布局
Apr 02 Javascript
jquery实现可自动收缩的TAB网页选项卡代码
Sep 06 Javascript
tween.js缓动补间动画算法示例
Feb 13 Javascript
使用vuex缓存数据并优化自己的vuex-cache
May 30 Javascript
vue 2.1.3 实时显示当前时间,每秒更新的方法
Sep 16 Javascript
小程序实现留言板
Nov 02 Javascript
详解react阻止无效重渲染的多种方式
Dec 11 Javascript
JavaScript学习教程之cookie与webstorage
Jun 23 Javascript
原生JS实现留言板功能
Feb 08 Javascript
微信小程序实现拼图小游戏
Oct 22 Javascript
利用uni-app生成微信小程序的踩坑记录
Apr 05 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
PHP控制网页过期时间的代码
2008/09/28 PHP
php实现首页链接查询 友情链接检查的代码
2010/01/05 PHP
php使用codebase生成随机数
2014/03/25 PHP
php读取csv文件并输出的方法
2015/03/14 PHP
twig模板获取全局变量的方法
2016/02/05 PHP
PHP读取文本文件并逐行输出该行使用最多的字符与对应次数的方法
2016/11/25 PHP
PHP简单装饰器模式实现与用法示例
2017/06/22 PHP
一段非常简单的让图片自动切换js代码
2006/11/10 Javascript
js 图片等比例缩放代码
2010/05/13 Javascript
JavaScript初学者需要了解10个小技巧
2010/08/25 Javascript
jQuery Tab插件 用于在Tab中显示iframe,附源码和详细说明
2011/06/27 Javascript
javascript中的缓动效果实现程序
2012/12/29 Javascript
js获取location.href的参数实例代码
2013/08/02 Javascript
禁止空格提交表单的js代码
2013/11/17 Javascript
jquery实现适用于门户站的导航下拉菜单效果代码
2015/08/24 Javascript
jquery选择器简述
2015/08/31 Javascript
js弹出框、对话框、提示框、弹窗实现方法总结(推荐)
2016/05/31 Javascript
jQuery实现页面下拉100像素出现悬浮窗口的方法
2016/09/05 Javascript
Angular指令封装jQuery日期时间插件datetimepicker实现双向绑定示例
2017/01/22 Javascript
webpack2.0配置postcss-loader的方法
2017/08/17 Javascript
Vue中的组件及路由使用实例代码详解
2019/05/22 Javascript
python使用cStringIO实现临时内存文件访问的方法
2015/03/26 Python
基于Python实现通过微信搜索功能查看谁把你删除了
2016/01/27 Python
Python 异常处理的实例详解
2017/09/11 Python
Python 生成 -1~1 之间的随机数矩阵方法
2018/08/04 Python
python 定时器每天就执行一次的实现代码
2019/08/14 Python
Python产生一个数值范围内的不重复的随机数的实现方法
2019/08/21 Python
详解Canvas 跨域脱坑实践
2018/11/07 HTML / CSS
HTML5 video循环播放多个视频的方法步骤
2020/08/06 HTML / CSS
Steiff台湾官网:德国金耳釦泰迪熊
2019/12/26 全球购物
倡议书范文格式
2014/05/12 职场文书
幼儿园老师新年寄语2015
2014/12/08 职场文书
给老婆的检讨书1000字
2015/01/01 职场文书
李清照的诗词赏析(20首)
2019/08/22 职场文书
python爬取企查查企业信息之selenium自动模拟登录企查查
2021/04/08 Python
90行Python代码开发个人云盘应用
2021/04/20 Python