您好,欢迎访问一九零五行业门户网

用函数模板,写一个简单高效的 JSON 查询器的方法介绍_javascript技巧

json可谓是javascript的亮点,它能用优雅简练的代码实现object和array的初始化。同样是基于文本的数据定义,它比符号分隔更有语义,比xml更简洁。因此越来越多的js开发中,使用它作为数据的传输和储存。
js数组内置了不少有用的方法,方便我们对数据的查询和筛选。例如我们有一堆数据:
复制代码 代码如下:
var heros = [
        // 名============攻=====防=======力量====敏捷=====智力====
        {name:'冰室女巫', dp:38, ap:1.3, str:16, agi:16, int:21},
        {name:'沉默术士', dp:39, ap:1.1, str:17, agi:16, int:21},
        {name:'娜迦海妖', dp:51, ap:6.0, str:21, agi:21, int:18},
        {name:'赏金猎人', dp:39, ap:4.0, str:17, agi:21, int:16},
        {name:'剧毒术士', dp:45, ap:3.1, str:18, agi:22, int:15},
        {name:'光之守卫', dp:38, ap:1.1, str:16, agi:15, int:22},
        {name:'炼金术士', dp:49, ap:0.6, str:25, agi:11, int:25}
        //...
    ];
要查询攻击大于40并且防御小于4的英雄,我们可以用array的filter方法:
复制代码 代码如下:
var match = heros.filter(function(e) {
        return e.dp > 40 && e.ap     });
返回得到一个数组,包括符合条件的2个结果。相比手工去写循环判断,filter方法为我们提供了很大的方便。但它是基于函数回调的,所以每次使用必须写一个function,对于简单的查询很是累赘,而且使用回调效率也大大降低。但这是也没有办法的,想简单必然要牺牲一定性能。 如果能使用比这更简单的语句,并且完全拥有代码展开时效率,该有是多么完美的事。
先来想象下,要是能将上面的代码写成这样,并且查询速度和手写的遍历判断一样:
复制代码 代码如下:
var match = heros.select('@dp>40 and @ap
看上去有点像sql,连语法都换了?这样岂不是要写一个词法分析,语义解释等等等等一大堆的脚本引擎的功能了,没个几千上万行代码都搞不定,而且效率肯定更糟了。。。如果想到那么复杂,那么你还没深刻的理解脚本的精髓。但凡是脚本语言,都有运行时动态解释代码的接口,例如vbs的execute();js的eval(),new function(),甚至创建一个
其它类似信息

推荐信息