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 相关文章推荐
指定位置如果有图片显示图片,无图片显示广告的JS
Jun 05 Javascript
js单例模式的两种方案
Oct 22 Javascript
href下载文件根据id取url并下载
May 28 Javascript
javascript实现点击按钮弹出一个可关闭层窗口同时网页背景变灰的方法
May 13 Javascript
简单的JS时钟实例讲解
Jan 13 Javascript
各式各样的导航条效果css3结合jquery代码实现
Sep 17 Javascript
JS实现简单的二元方程计算器功能示例
Jan 03 Javascript
深入理解Vue 的条件渲染和列表渲染
Sep 01 Javascript
详解微信小程序input标签正则初体验
Aug 18 Javascript
Iview Table组件中各种组件扩展的使用
Oct 20 Javascript
JS实现数据动态渲染的竖向步骤条
Jun 24 Javascript
node.js文件的复制、创建文件夹等相关操作
Feb 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中list方法用法示例
2016/12/01 PHP
JQuery获取元素文档大小、偏移和位置和滚动条位置的方法集合
2010/01/12 Javascript
菜鸟javascript基础资料整理2
2010/12/06 Javascript
jquery自动填充勾选框即把勾选框打上true
2014/03/24 Javascript
实现checkbox全选、反选、取消JavaScript小脚本异常
2014/04/10 Javascript
原生js与jQuery实现简单的tab切换特效对比
2015/07/30 Javascript
Grunt入门教程(自动任务运行器)
2015/08/06 Javascript
js实现微博发布小功能
2017/01/12 Javascript
简单谈谈关于 npm 5.0 的新坑
2017/06/08 Javascript
Mongoose实现虚拟字段查询的方法详解
2017/08/15 Javascript
原生js实现简单的模态框示例
2017/09/08 Javascript
关于JavaScript语句后面的分号问题
2017/12/07 Javascript
JS获取input[file]的值并显示在页面的实现方法
2018/03/09 Javascript
微信小程序Flex布局用法深入浅出分析
2019/04/25 Javascript
探索JavaScript中私有成员的相关知识
2019/06/13 Javascript
VUE 实现动态给对象增加属性,并触发视图更新操作示例
2019/11/29 Javascript
使用webpack/gulp构建TypeScript项目的方法示例
2019/12/18 Javascript
[02:40]DOTA2英雄基础教程 先知
2013/11/29 DOTA
[01:02:20]Mineski vs TNC 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
[36:09]Secret vs VG 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.24
2019/09/10 DOTA
python 中如何获取列表的索引
2019/07/02 Python
Python内建序列通用操作6种实现方法
2020/03/26 Python
在pycharm中创建django项目的示例代码
2020/05/28 Python
10个示例带你掌握python中的元组
2020/11/23 Python
深入CSS3 动画效果的总结详解
2013/05/09 HTML / CSS
Nixon手表英国官网:美国尼克松手表品牌
2020/02/10 全球购物
卡拉威高尔夫官方网站:Callaway Golf
2020/09/16 全球购物
美国亚马逊旗下时尚女装网店:SHOPBOP(支持中文)
2020/10/17 全球购物
MVC的各个部分都有那些技术来实现?如何实现?
2016/04/21 面试题
毕业生大学生活自我总结
2014/01/31 职场文书
小学运动会班级口号
2014/06/09 职场文书
成都人事代理协议书
2014/10/25 职场文书
公司聚餐通知
2015/04/22 职场文书
集结号观后感
2015/06/08 职场文书
会计专业2019暑假实习报告
2019/06/21 职场文书
Golang原生rpc(rpc服务端源码解读)
2022/04/07 Golang