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

时间:2014-08-26 20:47:24

标签: javascript json node.js

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

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

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

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

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

2 个答案:

答案 0 :(得分:22)

underscore有一个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}]

另一个实用程序库Lo-Dash具有where功能,操作相同。


您可以使用

为项目添加下划线
$ 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"});

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

在不知道你真正想做什么的情况下,我已经将此作为一个例子。出于此代码的目的,可能会考虑调试日志记录流或其他内容。

<强> JSON-parser.js

输入:字符串(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

输入:对象
output:object(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

输入:对象
输出:字符串(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}]

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

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

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

答案 1 :(得分:2)

您可以使用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
        }
    }
}