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 中处理数据。