【问题标题】:How to filter JSON data in node.js? [duplicate]如何过滤 node.js 中的 JSON 数据? [复制]
【发布时间】:2014-10-20 07:31:15
【问题描述】:

我已经看到了这个问题的非常古老的答案,而且两年前使用的许多技术已经发生了变化。

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

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

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

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

【问题讨论】:

  • 寻求库推荐的问题在 StackOverflow 上被认为是题外话(参见 FAQ 中的项目 #4),但我认为这是一个很好的核心问题。我对其进行了一些编辑以使其保持主题,但如果您愿意,请随时进一步完善它!

标签: javascript json node.js


【解决方案1】:

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

输入:对象
输出:对象(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 中处理数据。

【讨论】:

  • 非常感谢您发布所有这些内容!
【解决方案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
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-26
    • 1970-01-01
    • 1970-01-01
    • 2018-01-07
    • 2017-09-21
    • 1970-01-01
    相关资源
    最近更新 更多