其实很简单,我这部分代码,前一部分是简单的实现如何使用js写模板,第二个就是具体的实现了json查询的一个扩展。
以后查询json就有了利器了。
复制代码 代码如下:
/*
* 定义模板函数
*/
var template = function (queryarr) { var count = 0;
for (var i = 0; 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 var s = arr[i];
for (var j = 0; j if (index(s, _alias[j]) > -1) {
s = s.replace(_alias[j], _alias[j + 1]);
}
}
arr[i] = s;
}
for (var i = 1; i 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);
}
代码就是这样了。欢迎大家拍砖,或者可以提出新的想法。我们一起来扩展
