In fact, it is very simple. The first part of my code is simple implementation of how to use JS to write templates. The second part is the specific implementation of a JSON query extension.
Json query will be available in the future.
Copy codeThe Code is as follows:
/*
* Define template Functions
*/
Var template = function (queryArr ){
Var count = 0;
For (var I = 0; I <queryArr. length; I ++ ){
Var e = queryArr [I];
If ($ express ){
Count ++;
}
}
Return count;
}
/*
* Template creation Function
*/
Var createIntance = function (exp ){
Var fun = template. toString (). replace ("$ express", exp). toString ();
Return eval ("0," + fun );
}
Var testTodo = function (){
Var testArr = [
{Name: "Zhang San", age: 20 },
{Name: "Li Si", age: 25 },
{Name: "Wang Erma zi", age: 28 },
{Name: "Xiao Zhang", age: 30}
];
Var func = createIntance ("e. age> = 25 ");
Alert (func (testArr ));
}
/***************** JSON query in JS ***************** *****/
// Define common functions
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 ;}
// Extended Prototype Method
Var _ proto = Object. prototype;
// Cache for quick search
Var _ cache = {};
// Extension operator
Var _ alias = [
/@/G, "_ e .",
/AND/gi ,"&&",
/OR/gi, "| ",
/<>/G ,"! = ",
/NOT/gi ,"! ",
/([^ = <>]) = ([^ =] | $)/G, '$1 = $2'
];
Var _ rQuote =/""/g;
Var _ rQuoteTemp = /!~ /G;
// Compile
Var _ complite = function (code ){
Return eval ("0," + code );
}
// Convert the extension symbol into a standard JS symbol
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 ('"');
}
// Define a model function
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 ();
// Extended Query Method
_ 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 = intelligence ====
{Name: 'ice witch ', DP: 38, AP: 1.3, Str: 16, Dex: 16, Int: 21 },
{Name: 'silent locker', DP: 39, AP: 1.1, Str: 17, Dex: 16, Int: 21 },
{Name: 'naga haidao ', DP: 51, AP: 6.0, Str: 21, Dex: 21, Int: 18 },
{Name: 'bounty hunter ', DP: 39, AP: 4.0, Str: 17, Dex: 21, Int: 16 },
{Name: 'highly toxic wareer', DP: 45, AP: 3.1, Str: 18, Dex: 22, Int: 15 },
{Name: 'guard of light ', DP: 38, AP: 1.1, Str: 16, Dex: 15, Int: 22 },
{Name: 'authorization', DP: 49, AP: 0.6, Str: 25, Dex: 11, Int: 25}
//...
];
Var match = heros. Query ('@ Str> 20 AND @ Dex> 20 ');
ShowResult (match [0]);
// Query:
// Result: silent locks, highly toxic locks, and alchemy locks
Var match = heros. Query ('Right (@ name, 1) = "Shi "');
ShowResult (match [0]);
}
Function ShowResult (result ){
Alert (result. name + "" + result. DP + "" + result. AP + "" + result. str + "" + result. dex + "" + result. int );
}
The code is like this. You are welcome to come up with new ideas. Let's expand together