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 相关文章推荐
通过ifame指向的页面高度调整iframe的高度
Oct 05 Javascript
javascript数组去重方法终极总结
Jun 05 Javascript
textarea不能通过maxlength属性来限制字数的解决方法
Sep 01 Javascript
使用do...while的方法输入一个月中所有的周日(实例代码)
Jul 22 Javascript
值得学习的bootstrap fileinput文件上传工具
Nov 08 Javascript
jQuery弹出div层过2秒自动消失
Nov 29 Javascript
纯js实现悬浮按钮组件
Dec 17 Javascript
基于vue+ bootstrap实现图片上传图片展示功能
May 17 Javascript
jQuery实现简单日期格式化功能示例
Sep 19 jQuery
让你5分钟掌握9个JavaScript小技巧
Jun 09 Javascript
Layer弹出层动态获取数据的方法
Aug 20 Javascript
深入了解响应式React Native Echarts组件
May 29 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
浅析ThinkPHP中的pathinfo模式和URL重写
2014/01/06 PHP
thinkphp跨库操作的简单代码实例
2016/09/22 PHP
XRegExp 0.2: Now With Named Capture
2007/11/30 Javascript
setAttribute 与 class冲突解决
2008/02/17 Javascript
javascript new fun的执行过程
2010/08/05 Javascript
jQuery.buildFragment使用方法及思路分析
2013/01/07 Javascript
使用js实现一个可编辑的select下拉列表
2014/02/20 Javascript
5种处理js跨域问题方法汇总
2014/12/04 Javascript
JScript中的条件注释详解
2015/04/24 Javascript
浅析js中substring和substr的方法
2015/11/09 Javascript
AngularJS仿苹果滑屏删除控件
2016/01/18 Javascript
详解AngularJS通过ocLazyLoad实现动态(懒)加载模块和依赖
2017/03/01 Javascript
JS中的数组转变成JSON格式字符串的方法
2017/05/09 Javascript
微信小程序分享功能之按钮button 边框隐藏和点击隐藏
2018/06/14 Javascript
vue单页面实现当前页面刷新或跳转时提示保存
2018/11/02 Javascript
10个最受欢迎的 JavaScript框架(推荐)
2019/04/24 Javascript
在node环境下parse Smarty模板的使用示例代码
2019/11/15 Javascript
详细分析vue表单数据的绑定
2020/07/20 Javascript
js在HTML的三种引用方式详解
2020/08/29 Javascript
[01:02:07]Liquid vs Newbee 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
python中使用urllib2伪造HTTP报头的2个方法
2014/07/07 Python
跟老齐学Python之玩转字符串(2)更新篇
2014/09/28 Python
python实现K最近邻算法
2018/01/29 Python
Django中的CBV和FBV示例介绍
2018/02/25 Python
django session完成状态保持的方法
2018/11/27 Python
利用python numpy+matplotlib绘制股票k线图的方法
2019/06/26 Python
python重要函数eval多种用法解析
2020/01/14 Python
python 使用cx-freeze打包程序的实现
2020/03/14 Python
python 多线程爬取壁纸网站的示例
2021/02/20 Python
利用CSS3伪元素实现逐渐发光的方格边框
2017/05/07 HTML / CSS
宝拉珍选澳大利亚官方购物网站:Paula’s Choice澳大利亚
2016/09/13 全球购物
一家专门做特卖的网站:唯品会
2016/10/09 全球购物
来自世界各地的饮料:Flavourly
2019/05/06 全球购物
车间班组长的职责
2013/12/13 职场文书
创业计划书中要认真思考的问题
2013/12/28 职场文书
十佳少先队员演讲稿
2014/09/12 职场文书