我想使用 revalidator ( https://github.com/flatiron/revalidator ) 的模式定义检查 Javascript 对象是否有不需要的属性。
我想出了以下片段:
function strip(object, schema) {
var strippedObject = {};
for (var property in schema.properties) {
if (schema.properties[property].type === 'object') {
strippedObject[property] = strip(object[property], schema.properties[property]);
} else {
strippedObject[property] = object[property];
}
}
return strippedObject;
}
此代码在递归到嵌套模式的模式上同步复制所需的属性和循环。
我担心这次会阻塞事件循环。
这可以忽略不计,因为我不做 I/O?
编辑
感谢您的评论。就像 jbaylina 提到的那样,模式确实嵌套到最多 2 个级别,每个级别可能有大约 10 个属性。尽管如此,我尝试使用 setImmediate 并且它可以工作,但是当它确实是一个问题时,我可能会异步迭代:
function strip(object, schema, callback) {
var strippedObject = {};
async.each(Object.keys(schema.properties), function (property, next) {
if (schema.properties.hasOwnProperty(property)) {
if (schema.properties[property].type && schema.properties[property].type === 'object') {
strip(object[property], schema.properties[property], function (err, obj) {
if (err) return next(err);
strippedObject[property] = obj;
next();
});
} else {
strippedObject[property] = object[property];
next();
}
}
}, function (err) {
if (err) return callback(err);
return callback(null, strippedObject);
});
}
这看起来真的很乱,但它有效并通过了测试。您如何看待这个解决方案?