如何过滤node.js中的JSON数据?

我已经看到了这个问题很老的答案,并且2年前使用的许多技术已经发生了变化。

我所拥有的是由数据库发送到我的服务器的JSON文件,我想知道如何过滤这些数据。

我正在运行一个服务器node.js,我想要做的是这样的:

var results = QueryLibrary.load(jsondata); var filtered = results.query('select where user = "user1"'); 

我怎么能做这样的JavaScript在节点运行?

下划线有一个地方function,只是这一点

 var _ = require("underscore"); var json = '[{"user": "a", "age": 20}, {"user": "b", "age": 30}, {"user": "c", "age": 40}]'; var users = JSON.parse(json); var filtered = _.where(users, {user: "a"}); // => [{user: "a", age: 20}] 

另一个实用程序库Lo-Dash具有相同的function。


您可以使用下划线添加到您的项目

 $ npm install --save underscore 

或lodash

 $ npm install --save lodash 

如果你关心where函数,lodash提供它作为一个单独的模块

 // only install lodash.where $ npm install --save lodash.where 

在你的项目中使用它

 var where = require("lodash.where"); // ... var filtered = where(users, {"user": "a"}); 

即使你使用一个库来做到这一点,一个更好的方法可能是设置一系列的stream,处理所有在较小的模块中的数据处理。

不知道你真正想做什么,我已经创造了这个例子。 为了这个代码的目的,也许想想一个debugging日志stream或什么的。

JSON-parser.js

input:string(JSON)
输出:对象

 var Transform = require("stream").Transform; function JsonParser() { Transform.call(this, {objectMode: true}); this._transform = function _transform(json, enc, done) { try { this.push(JSON.parse(json)); } catch (e) { return done(e); } done(); } } JsonParser.prototype = Object.create(Transform.prototype, { constructor: { value: JsonParser } }); module.exports = JsonParser; 

OBJ-filter.js

input:对象
输出:对象( where(data, filters)

 var Transform = require("stream").Transform; var where = require("lodash.where"); function ObjFilter(filters) { Transform.call(this, {objectMode: true}); this._transform = function _transform(obj, enc, done) { this.push(where(obj, filters)); done(); } } ObjFilter.prototype = Object.create(Transform.prototype, { constructor: { value: ObjFilter } }); module.exports = ObjFilter; 

stringifier.js

input:对象
输出:string(JSON)

 var Transform = require("stream").Transform; function Stringifier() { Transform.call(this, {objectMode: true}); this._transform = function _transform(obj, enc, done) { this.push(JSON.stringify(obj)); done(); } } Stringifier.prototype = Object.create(Transform.prototype, { constructor: { value: Stringifier } }); module.exports = Stringifier; 

app.js

 // modules var JsonParser = require("json-parser"); var ObjFilter = require("obj-filter"); var Stringifier = require("stringifier"); // run var parser = new JsonParser(); // setup stream chain parser.pipe(new ObjFilter({"user": "a"})) .pipe(new Stringifier()) .pipe(process.stdout); // send example json in parser.write('[{"user": "a", "age": 20}, {"user": "b", "age": 30}, {"user": "c", "age": 40}]'); // output // => [{"user":"a","age":20}] 

在这里,我创build了一个将对象转换回JSON的Stringifierstream,以便我们可以将它们转储到控制台中,尽pipe您可以轻松创build任何需要处理应用程序所需操作的stream。 您的stream终点可能不会写入控制台。

作为最后一点,你可能会创build一个接受某种查询选项并发出json的数据库stream。 您将直接将该stream传送到parser

无论如何,我希望这可以让你更好地了解如何在node.js中处理数据。

您可以使用任何JavaScript的常规数组/对象内置函数,通常这种查询将在从数据库中检索数据时进行,而不是在之后进行。

就像是

 for(i=0;i<objIdsArray.length;i++) { for(j=0;j<mockJSON.length;j++) { if(mockJSON[j]["id"] === parseInt(objIdsArray[i])) { mockJSON.splice(j, 1); // to delete it, could be any other instruction } } }