JS 实现Json查询的方法实例_javascript技巧

     其实很简单,我这部分代码,前一部分是简单的实现如何使用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);
        }

     代码就是这样了。欢迎大家拍砖,或者可以提出新的想法。我们一起来扩展

时间: 2024-09-19 05:25:20

JS 实现Json查询的方法实例_javascript技巧的相关文章

js实现jquery的offset()方法实例_javascript技巧

本文实例讲述了js实现jquery的offset()方法.分享给大家供大家参考.具体分析如下: 用过jQuery的offset()的同学都知道offset().top或offset().left很方便地取得元素相对于整个页面的偏移. 而在js里,没有这样直接的方法,节点的属性offsetTop可以获得该节点相对于父节点的相对偏移,但不能直接获得其绝对偏移,我们可用节点逐层递归向上来相加offsetTop来获得绝对偏移. 复制代码 代码如下: function getOffset(Node, of

Json字符串转换为JS对象的高效方法实例_javascript技巧

今天学习JQuery源码看到一下方法,原来还可以这样解析JSON字符串: 复制代码 代码如下:   parseJSON: function( data ) {  if ( typeof data !== "string" || !data ) {   return null;  }   // Make sure leading/trailing whitespace is removed (IE can't handle it)  data = jQuery.trim( data );

用JS生成UUID的方法实例_javascript技巧

用JS生成UUID的方法实例 <!DOCTYPE html> <html> <head> <script src="http://libs.baidu.com/jquery/1.10.2/jquery.min.js"> </script> <script> var id=getUuid(); $(document).ready(function(){ $("p").click(function(

原生JS简单实现ajax的方法示例_javascript技巧

本文实例讲述了原生JS简单实现ajax的方法.分享给大家供大家参考,具体如下: HTML部分: <body> <input type="button" value="Ajax提交" onclick="Ajax();" /> <div id="resText" ></div> </body> 这里有个input按钮,点击会触发click事件,click事件调用Ajax(

JS页面延迟执行一些方法(整理)_javascript技巧

一般在JS页面延迟执行一些方法.可以使用以下的方法 jQuery.delay()方法简介 http://shawphy.com/2010/11/jquery-delay.html jQuery中queue和dequeue的用法 http://www.jb51.net/article/25481.htm Window.setTimeout http://www.jb51.net/article/20741.htm以下是我用到的一些例子. 复制代码 代码如下: //延迟查询,传一个查询btn的ID,

js实现简单锁屏功能实例_javascript技巧

本文实例讲述了js实现简单锁屏功能的方法.分享给大家供大家参考.具体实现方法如下: //********* 锁屏DIV *************************** function LockScreen(tag,title,width,height,url) { if (tag) //锁屏 { var lockdiv = document.getElementById("lockscreen"); if (lockdiv!=null) { lockdiv.style.dis

JS随机打乱数组的方法小结_javascript技巧

本文实例总结了JS随机打乱数组的方法.分享给大家供大家参考,具体如下: JS中,要打乱数组有很多方法,网上流传一个国外人写的方法,我认为是最精简的了: function randomsort(a, b) { return Math.random()>.5 ? -1 : 1; //用Math.random()函数生成0~1之间的随机数与0.5比较,返回-1或1 } var arr = [1, 2, 3, 4, 5]; arr.sort(randomsort); 这里介绍下sort()函数,在JS中

js预加载图片方法汇总_javascript技巧

本文实例汇总了js预加载图片方法.分享给大家供大家参考.具体分析如下: 1. 纯CSS: #preload-01 { background: url(yun_qi_img/image-01.png) no-repeat -9999px -9999px; } #preload-02 { background: url(yun_qi_img/image-02.png) no-repeat -9999px -9999px; } #preload-03 { background: url(yun_qi_

JS无缝滚动效果实现方法分析_javascript技巧

本文实例讲述了JS无缝滚动效果实现方法.分享给大家供大家参考,具体如下: 效果: 1.默认缓慢往左滚动 2.放到左箭头上还是向左滚动,放到右箭头上向右滚动 3.放到图片上停止滚动,移出继续滚动 思路: 1.计算图片列表ul的宽度 2.开启定时器,使其向左边距不断增大,造成向左运动的效果 3.图片列表复制一份,向左移动时,当左边距大于一份的宽度时,把它的左边距拉回到0.向右移动时,当左边距大于0时,把它的左边距拉到整个两份图片列表一半的宽度(即一份的宽度).(拉的瞬间很快,用户察觉不到,造成一种无