我已经看到了这个问题很老的答案,2年前使用的许多技术都发生了变化。
我所拥有的是数据库发送到我的服务器的JSON文件,我想知道的是如何过滤这些数据。
我正在使用node.js运行服务器,我想做的是:
var results = QueryLibrary.load(jsondata);
var filtered = results.query('select where user = "user1"');
如何在节点中运行的javascript中执行此类操作?
答案 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
}
}
}