如何过滤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的Stringifier
stream,以便我们可以将它们转储到控制台中,尽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 } } }