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 相关文章推荐
基于jquery的多功能软键盘插件
Jul 25 Javascript
JS 各种网页尺寸判断实例方法
Apr 18 Javascript
jQuery中find()方法用法实例
Jan 07 Javascript
jQuery 1.9.1源码分析系列(十)事件系统之绑定事件
Nov 19 Javascript
vue组件发布到npm简单步骤
Nov 30 Javascript
js使用Promise实现简单的Ajax缓存
Nov 14 Javascript
详解JS取出两个数组中的不同或相同元素
Mar 20 Javascript
使用webpack搭建vue项目及注意事项
Jun 10 Javascript
微信小程序可滑动周日历组件使用详解
Oct 21 Javascript
微信小程序实现点击页面出现文字
Sep 21 Javascript
SpringBoot在yml配置文件中配置druid的操作
Nov 16 Javascript
vue祖孙组件之间的数据传递案例
Dec 07 Vue.js
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编译安装时常见错误解决办法
2015/05/28 PHP
PHP实现微信发红包程序
2015/08/24 PHP
php设计模式之正面模式实例分析【星际争霸游戏案例】
2020/03/24 PHP
PHP程序员简单的开展服务治理架构操作详解(一)
2020/05/14 PHP
Egret引擎开发指南之编译项目
2014/09/03 Javascript
再JavaScript的jQuery库中编写动画效果的指南
2015/08/13 Javascript
Jquery幻灯片特效代码分享--打开页面随机选择切换方式(3)
2015/08/15 Javascript
微信小程序实战之顶部导航栏(选项卡)(1)
2020/06/19 Javascript
js指定步长实现单方向匀速运动
2017/07/17 Javascript
浅析java线程中断的办法
2018/07/29 Javascript
React Component存在的几种形式详解
2018/11/06 Javascript
jquery3和layui冲突导致使用layui.layer.full弹出全屏iframe窗口时高度152px问题
2019/05/12 jQuery
vue v-for 点击当前行,获取当前行数据及event当前事件对象的操作
2020/09/10 Javascript
js+cavans实现图片滑块验证
2020/09/29 Javascript
[01:22:19]EG vs TNC Supermajor小组赛B组败者组第一轮 BO3 第二场 6.2
2018/06/03 DOTA
对于Python中线程问题的简单讲解
2015/04/03 Python
Python中返回字典键的值的values()方法使用
2015/05/22 Python
Python实现SVN的目录周期性备份实例
2015/07/17 Python
快速了解Python开发中的cookie及简单代码示例
2018/01/17 Python
Python实现连接MySql数据库及增删改查操作详解
2019/04/16 Python
Django基础三之视图函数的使用方法
2019/07/18 Python
python连接打印机实现打印文档、图片、pdf文件等功能
2020/02/07 Python
Python如何进行时间处理
2020/08/06 Python
python实现图片素描效果
2020/09/26 Python
Schecker荷兰:狗狗用品和配件
2019/06/06 全球购物
为什么需要版本控制?
2013/08/08 面试题
初中三好学生事迹材料
2014/01/13 职场文书
施工安全责任书范本
2014/07/24 职场文书
干部对照检查材料范文
2014/08/26 职场文书
投标单位介绍信
2015/05/05 职场文书
深入理解python多线程编程
2021/04/18 Python
Vue详细的入门笔记
2021/05/10 Vue.js
python ansible自动化运维工具执行流程
2021/06/24 Python
Python学习之os包使用教程详解
2022/03/21 Python
《最终幻想14》6.01版本4月5日推出 追加新任务新道具
2022/04/03 其他游戏
Android使用EventBus发送消息,Fragment中接收消息的方法会执行多次
2022/04/24 Java/Android