【发布时间】:2013-08-16 18:32:12
【问题描述】:
我想使用重新验证器 (https://github.com/flatiron/revalidator) 的架构定义检查 Javascript 对象是否存在不需要的属性。
我想出了以下sn-p:
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 吗?
编辑
感谢 cmets。就像 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);
});
}
这看起来真的很乱,但它可以工作并且通过了测试。您如何看待这个解决方案?
【问题讨论】:
标签: javascript node.js for-in-loop