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 document.createDocumentFragment()
Apr 04 Javascript
javascript 二维数组的实现与应用
Mar 16 Javascript
使用jquery选择器如何获取父级元素、同级元素、子元素
May 14 Javascript
JavaScript中循环遍历Array与Map的方法小结
Mar 12 Javascript
基于JavaScript实现前端文件的断点续传
Oct 17 Javascript
如何判断出一个js对象是否一个dom对象
Nov 24 Javascript
微信小程序 判断手机号的实现代码
Apr 19 Javascript
jQuery滑动到底部加载下一页数据的实例代码
May 22 jQuery
详解基于vue的移动web app页面缓存解决方案
Aug 03 Javascript
JS路由跳转的简单实现代码
Sep 21 Javascript
vue中v-for循环给标签属性赋值的方法
Oct 18 Javascript
vue 输入电话号码自动按3-4-4分割功能的实现代码
Apr 30 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
历史证明,懒惰才是推动科学发展技术进步的动力
2021/03/02 无线电
php实现向javascript传递数组的方法
2015/07/27 PHP
拖动一个HTML元素
2006/12/22 Javascript
javascript 写类方式之二
2009/07/05 Javascript
Javascript this 的一些学习总结
2012/08/31 Javascript
通过onmouseover选项卡实现img图片的变化
2014/02/12 Javascript
jquery根据属性和index来查找属性值并操作
2014/07/25 Javascript
jQuery实现复选框成对选择及对应取消的方法
2015/03/03 Javascript
利用jQuery实现WordPress中@的ID悬浮显示评论内容
2015/12/11 Javascript
js实现精确到秒的日期选择器完整实例
2016/04/30 Javascript
多个上传文件用js验证文件的格式和大小的方法(推荐)
2017/03/09 Javascript
jQuery插件FusionWidgets实现的Cylinder图效果示例【附demo源码】
2017/03/23 jQuery
如何通过非数字与字符的方式实现PHP WebShell详解
2017/07/02 Javascript
Vue实现内部组件轮播切换效果的示例代码
2018/04/07 Javascript
vue移动端实现红包雨效果
2020/06/23 Javascript
React组件重构之嵌套+继承及高阶组件详解
2018/07/19 Javascript
JavaScript如何实现元素全排列实例代码
2019/05/14 Javascript
Vue+Element自定义纵向表格表头教程
2020/10/26 Javascript
解决vue props传Array/Object类型值,子组件报错的情况
2020/11/07 Javascript
[07:54]DOTA2 MV《我的动力鞋》 ImbaTV 出品
2014/11/21 DOTA
详解使用python的logging模块在stdout输出的两种方法
2017/05/17 Python
VSCode下好用的Python插件及配置
2018/04/06 Python
Python装饰器简单用法实例小结
2018/12/03 Python
python识别图像并提取文字的实现方法
2019/06/28 Python
如何验证python安装成功
2020/07/06 Python
Python selenium环境搭建实现过程解析
2020/09/08 Python
python爬虫实现爬取同一个网站的多页数据的实例讲解
2021/01/18 Python
pytorch 计算Parameter和FLOP的操作
2021/03/04 Python
HTML5 常见面试题之PC端和移动端区别介绍
2018/01/22 HTML / CSS
canvas实现漂亮的下雨效果的示例
2018/04/18 HTML / CSS
校本教研工作制度
2014/01/22 职场文书
中专毕业生个人职业生涯规划
2014/02/19 职场文书
工作证明格式及范本
2014/09/12 职场文书
民族学专业大学生职业规划范文:清晰未来的构想
2014/09/20 职场文书
机关单位保密工作责任书
2015/05/11 职场文书
jupyter notebook保存文件默认路径更改方法汇总(亲测可以)
2021/06/09 Python