search
HomeWeb Front-endJS TutorialIntroduction to how to write a simple and efficient JSON query using function templates_javascript skills

JSON can be said to be the highlight of JavaScript. It can implement the initialization of Object and Array with elegant and concise code. It is also a text-based data definition, which is more semantic than symbol separation and more concise than XML. Therefore, more and more JS developers use it as data transmission and storage.

JS arrays have many useful methods built-in to facilitate our query and filtering of data. For example, we have a bunch of data:

Copy code The code is as follows:

var heroes = [
          // Name============Attack======Defense========Strength====Dexterity=====Intelligence====
                                                         name: 'Ice Room Witch', DP: 38, AP: 1.3, STR: 16, AGI: 16, int: 21},
{name: 'Silent Warlock', DP: 39, AP: 1.1, STR: 17, Agi:16, Int:21},
{name:'Naga Siren', DP:51, AP:6.0, Str:21, Agi:21, Int:18},
{name :'Bounty Hunter', DP:39, AP:4.0, Str:17, Agi:21, Int:16},
                                                                                                 ​18, Agi:22, Int:15},
{name:'Guardian of Light', DP:38, AP:1.1, Str:16, Agi:15, Int:22},
{name: 'Alchemist', DP:49, AP:0.6, Str:25, Agi:11, Int:25}
                                                                                                                     For heroes whose defense is greater than 40 and whose defense is less than 4, we can use Array’s filter method:


Copy code

The code is as follows: var match = heroes.filter(function(e) {                                                                                                                     .
Compared with manually writing loop judgments, the filter method provides us with great convenience. But it is based on function callbacks, so you must write a function every time you use it, which is very cumbersome for simple queries, and the efficiency of using callbacks is also greatly reduced. But there is no way to do this. If you want to be simple, you must sacrifice a certain amount of performance. How perfect it would be if we could use simpler statements than this and fully enjoy the efficiency of code expansion.

First imagine, if the above code can be written like this, and
the query speed is the same as the handwritten traversal judgment
:

Copy the code

The code is as follows:

var match = heroes.select('@DP>40 AND @AP It looks a bit like SQL, even the syntax has been changed? Wouldn't this mean that we would have to write a lot of script engine functions such as lexical analysis, semantic interpretation, etc. It would be impossible to handle even thousands of lines of code, and the efficiency would definitely be worse. . . If you think it's that complicated, then you haven't deeply understood the essence of the script. All scripting languages ​​have interfaces for dynamically interpreting code at runtime, such as execute() of VBS; eval(), new Function() of JS, and even create a <script> to dynamically write code. </script>
Obviously, if another language can be translated into js code, then it can be directly handed over to the host for execution!


For example, for the characters in the select above, we simply replace "@" with "e." and "AND" with "&&", so it becomes a legal js expression that can be handed over to eval. implement.

So what we have to do is to translate the original statement into a js statement for execution. And in order to improve efficiency, the translated js expression is inlined into a context environment to generate an executable function body, instead of relying on callbacks for judgment in each traversal.

So, function templates will come in handy.

Introduction to function templates

In C, there are such things as macros and class templates, which can allow some calculations to be completed during the compilation phase, greatly improving the performance of the runtime code. Although the script is not compiled in the strict sense, it will be parsed and fully optimized the first time it is executed. This is a point of competition between current mainstream browsers. Therefore, we need to embed the repeated eval code into the template function provided in advance: a function that is ready and only needs expression calculation:

Copy code

The code is as follows:


/**
* Template: tmplCount
* Function: Count the number of expressions matching $express in the arr array
*/
function tmplCount(arr) {
var count = 0;

for(var i = 0; i var e = arr[i];

if($express) {
🎜>The above is a template function that traverses the parameters arr [] and count the number matching $express. Except for the expressions within if(...), everything else is ready. The character $express can also be replaced by other identifiers, as long as it does not conflict with other characters in the function.

When we need to instantiate, we first convert the function into string format through tmplCount.toString(), then replace $express with the expression we want, and finally eval this string of characters to get a Function type Variables, an instance of a template function is generated!


Let’s give a simple demonstration:


Copy the code
The code is as follows:

/** * Function: createInstance * Parameters: exp * A js expression string, used to replace the $express of the tmplCount template * Return:
* Returns a Function, template tmplCount Example
*/
function createInstance(exp)
{
// Replace the expression in the template
var code = tmplCount.toString()
.replace ('$express', exp);

// Prevent anonymous functions from directly eval reporting errors
var fn = eval('0,' code);

// Return template instance


// Test parameters
var student = [
{name: 'Jane', age: 14}, {name: 'Jack', age: 20},

{name: 'Adam', age: 18}
];

// demo1

var f1 = createInstance('e.age alert(f1(student)); //1

// demo2
var f2 = createInstance('e.name!="Jack" && e.age>=14');
alert(f2(student)); //2

Note that among the parameters of createInstance(), there is an object called e, which is defined in the tmplCount template and refers to the specific element during traversal. The returned f1 and f2 are two instances of the tmplCount template. The final called f1 and f2 functions have already embedded our expression statements, just like we have written two functions with the same function in advance, so the expressions are run directly during traversal without callbacks or anything, which is efficient. Significant improvement.


In fact, to put it bluntly, tmplCount exists only to provide the string of this function, and it itself will never be called. In fact, the definition in the form of a string is the same, but writing it in a function is more intuitive and convenient for testing.

It is worth noting that if the script needs compression optimization later, the tmplCount template must not be involved, otherwise the corresponding "e." and "$express" may change.


JSON basic query function

Now that we have introduced the use and implementation of function templates, let’s look back at the previous JSON query language. We only need to translate sql-like statements into js expressions and generate a function template instance. For the same statement, we can cache it to avoid translation every time.

First we implement the query template:

Copy the code

The code is as follows:


var __proto = Object.prototype;

//
// Template: __tmpl
// Parameters: $C
// Description: Record and return the set of elements matching $C in the _list object
//
var __tmpl = function(_list) {
var _ret = [];
var _i = -1;

for(var _k in _list) {
var _e = _list[_k];

if(_e && _e != __proto[_k]) {
if ($C)
                                                                                                                                                                         
}.toString();

Then start writing the select method of Object:



Copy code
The code is as follows: // // select method implementation
//
var __cache = {};

__proto.select = function(exp) {
If(!exp)
return [];

var fn = __cache[exp];

try { if(!fn) {

var code = __interpret(exp); //Interpret expression

code = __tmpl.replace('$C' , code); //Application Go to template


                      fn = __cache[exp] = __compile(code);                                                                                                                                                                       
          return fn(this);                                                                                                                                                                     }
}


The __cache table implements the cache of query statements. For repeated queries, performance can be greatly improved.




Copy code


The code is as follows:



function __compile() {
return eval(' 0,' arguments[0]); } The reason why __compile is written separately in an empty function is to have as clean a context as possible when eval is executed. __interpret is the top priority of the entire system and is responsible for translating query statements into js statements. Its implementation is a matter of opinion, but keep it as simple as possible and don't over-analyze the syntax.
View specific code:
jsonselect.rar

For demonstration purposes, only some basic functions are currently implemented. In the future, you can also add LIKE, BETWEEN, ORDER BY and other commonly used functions.

Demo


Copy code

The code is as follows:

var Heros = [
// name ===================== Power === agile == ===Intelligence====
{name:'Icehouse Witch', DP:38, AP:1.3, Str:16, Agi:16, Int:21},
{name:'Silent Warlock ', DP:39, AP:1.1, Str:17, Agi:16, Int:21},
                                                                                    21, Int:18},
{name:'Bounty Hunter', DP:39, AP:4.0, Str:17, Agi:21, Int:16},
{name:'Venomancer' ', DP:45, AP:3.1, Str:18, Agi:22, Int:15},
{name:'Guardian of Light', DP:38, AP:1.1, Str:16, Agi:15 , Int:22},
                                                                                                                                                                                                     ;




Copy code The code is as follows: // Query: strength,
whose agility exceeds 20 // Result: Naga Siren
var match = heroes.select('@Str>20 AND @Agi>20');

// Query:
ending in "Scholar" // Result: Silence Warlock, Venomancer, Alchemist var match = heroes.select('right(@name,1)="Shi" ');


// Query:
with more than 500 health // Result: Alchemist

var match = heroes.select('100 @Str*19 > 500');




Statement
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Understanding the JavaScript Engine: Implementation DetailsUnderstanding the JavaScript Engine: Implementation DetailsApr 17, 2025 am 12:05 AM

Understanding how JavaScript engine works internally is important to developers because it helps write more efficient code and understand performance bottlenecks and optimization strategies. 1) The engine's workflow includes three stages: parsing, compiling and execution; 2) During the execution process, the engine will perform dynamic optimization, such as inline cache and hidden classes; 3) Best practices include avoiding global variables, optimizing loops, using const and lets, and avoiding excessive use of closures.

Python vs. JavaScript: The Learning Curve and Ease of UsePython vs. JavaScript: The Learning Curve and Ease of UseApr 16, 2025 am 12:12 AM

Python is more suitable for beginners, with a smooth learning curve and concise syntax; JavaScript is suitable for front-end development, with a steep learning curve and flexible syntax. 1. Python syntax is intuitive and suitable for data science and back-end development. 2. JavaScript is flexible and widely used in front-end and server-side programming.

Python vs. JavaScript: Community, Libraries, and ResourcesPython vs. JavaScript: Community, Libraries, and ResourcesApr 15, 2025 am 12:16 AM

Python and JavaScript have their own advantages and disadvantages in terms of community, libraries and resources. 1) The Python community is friendly and suitable for beginners, but the front-end development resources are not as rich as JavaScript. 2) Python is powerful in data science and machine learning libraries, while JavaScript is better in front-end development libraries and frameworks. 3) Both have rich learning resources, but Python is suitable for starting with official documents, while JavaScript is better with MDNWebDocs. The choice should be based on project needs and personal interests.

From C/C   to JavaScript: How It All WorksFrom C/C to JavaScript: How It All WorksApr 14, 2025 am 12:05 AM

The shift from C/C to JavaScript requires adapting to dynamic typing, garbage collection and asynchronous programming. 1) C/C is a statically typed language that requires manual memory management, while JavaScript is dynamically typed and garbage collection is automatically processed. 2) C/C needs to be compiled into machine code, while JavaScript is an interpreted language. 3) JavaScript introduces concepts such as closures, prototype chains and Promise, which enhances flexibility and asynchronous programming capabilities.

JavaScript Engines: Comparing ImplementationsJavaScript Engines: Comparing ImplementationsApr 13, 2025 am 12:05 AM

Different JavaScript engines have different effects when parsing and executing JavaScript code, because the implementation principles and optimization strategies of each engine differ. 1. Lexical analysis: convert source code into lexical unit. 2. Grammar analysis: Generate an abstract syntax tree. 3. Optimization and compilation: Generate machine code through the JIT compiler. 4. Execute: Run the machine code. V8 engine optimizes through instant compilation and hidden class, SpiderMonkey uses a type inference system, resulting in different performance performance on the same code.

Beyond the Browser: JavaScript in the Real WorldBeyond the Browser: JavaScript in the Real WorldApr 12, 2025 am 12:06 AM

JavaScript's applications in the real world include server-side programming, mobile application development and Internet of Things control: 1. Server-side programming is realized through Node.js, suitable for high concurrent request processing. 2. Mobile application development is carried out through ReactNative and supports cross-platform deployment. 3. Used for IoT device control through Johnny-Five library, suitable for hardware interaction.

Building a Multi-Tenant SaaS Application with Next.js (Backend Integration)Building a Multi-Tenant SaaS Application with Next.js (Backend Integration)Apr 11, 2025 am 08:23 AM

I built a functional multi-tenant SaaS application (an EdTech app) with your everyday tech tool and you can do the same. First, what’s a multi-tenant SaaS application? Multi-tenant SaaS applications let you serve multiple customers from a sing

How to Build a Multi-Tenant SaaS Application with Next.js (Frontend Integration)How to Build a Multi-Tenant SaaS Application with Next.js (Frontend Integration)Apr 11, 2025 am 08:22 AM

This article demonstrates frontend integration with a backend secured by Permit, building a functional EdTech SaaS application using Next.js. The frontend fetches user permissions to control UI visibility and ensures API requests adhere to role-base

See all articles

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

AI Hentai Generator

AI Hentai Generator

Generate AI Hentai for free.

Hot Article

R.E.P.O. Energy Crystals Explained and What They Do (Yellow Crystal)
1 months agoBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Best Graphic Settings
1 months agoBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. How to Fix Audio if You Can't Hear Anyone
1 months agoBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Chat Commands and How to Use Them
1 months agoBy尊渡假赌尊渡假赌尊渡假赌

Hot Tools

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

This project is in the process of being migrated to osdn.net/projects/mingw, you can continue to follow us there. MinGW: A native Windows port of the GNU Compiler Collection (GCC), freely distributable import libraries and header files for building native Windows applications; includes extensions to the MSVC runtime to support C99 functionality. All MinGW software can run on 64-bit Windows platforms.

EditPlus Chinese cracked version

EditPlus Chinese cracked version

Small size, syntax highlighting, does not support code prompt function

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

SublimeText3 Linux new version

SublimeText3 Linux new version

SublimeText3 Linux latest version

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment