return fn(this); //查询当前对象
}
catch(e) {
return [];
}
}
其中__cache表实现了查询语句的缓存。对于重复的查询,性能可以极大的提升。
复制代码 代码如下:
function __compile() {
return eval('0,' + arguments[0]);
}
__compile之所以单独写在一个空函数里,就是为了eval的时候有个尽可能干净的上下文环境。
__interpret是整个系统的重中之重,负责将查询语句翻译成js语句。它的实现见智见仁,但尽可能简单,不要过度分析语法。
具体代码查看:jsonselect.rar
出于演示,目前只实现部分基本功能。以后还可以加上 LIKE,BETWEEN,ORDER BY 等等常用的功能。
Demo
复制代码 代码如下:
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}
//...
];
复制代码 代码如下:
// 查询:力量,敏捷 都超过20的
// 结果:娜迦海妖
var match = heros.select('@Str>20 AND @Agi>20');
// 查询:“士”结尾的
// 结果:沉默术士,剧毒术士,炼金术士
var match = heros.select('right(@name,1)="士" ');
// 查询:生命值 超过500的
// 结果:炼金术士
var match = heros.select('100 + @Str*19 > 500');
您可能感兴趣的文章: