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

Bry*_*can 9 javascript json node.js

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

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

我正在使用node.js运行服务器,我想做的是:

var results = QueryLibrary.load(jsondata);
var filtered = results.query('select where user = "user1"');
Run Code Online (Sandbox Code Playgroud)

如何在节点中运行的javascript中执行此类操作?

Tha*_*you 23

下划线有一个where函数可以做到这一点

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}]
Run Code Online (Sandbox Code Playgroud)

另一个实用程序库Lo-Dash具有相同操作的where函数.


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

$ npm install --save underscore
Run Code Online (Sandbox Code Playgroud)

或者lodash

$ npm install --save lodash
Run Code Online (Sandbox Code Playgroud)

如果您关心这个where功能,lodash会将其作为一个单独的模块提供

// only install lodash.where
$ npm install --save lodash.where
Run Code Online (Sandbox Code Playgroud)

在项目中使用它

var where = require("lodash.where");

// ...
var filtered = where(users, {"user": "a"});
Run Code Online (Sandbox Code Playgroud)

即使您使用库来执行此操作,更好的方法可能是设置一系列流,以处理较小模块中的所有数据处理.

在不知道你真正想做什么的情况下,我已经创建了这个例子.出于此代码的目的,可能会考虑调试日志流或其他内容.

JSON-parser.js

input:string(JSON)
输出:object

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;
Run Code Online (Sandbox Code Playgroud)

OBJ-filter.js

输入:对象
输出:对象(结果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;
Run Code Online (Sandbox Code Playgroud)

stringifier.js

输入:对象
输出:字符串(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;
Run Code Online (Sandbox Code Playgroud)

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}]
Run Code Online (Sandbox Code Playgroud)

在这里,我创建了一个Stringifier将对象转换回JSON 的流,以便我们可以看到它们被转储到控制台中,尽管您可以轻松创建处理应用程序所需操作所需的任何流.您的流端点可能不会以写入控制台的方式结束.

最后一点,您可能会创建一个接受某种查询选项并发出json的数据库流.您可以将该流直接传输到parser.

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