Javascript 使用for..in阻止事件循环

Javascript 使用for..in阻止事件循环,javascript,node.js,for-in-loop,Javascript,Node.js,For In Loop,我想用revalidator()的模式定义检查Javascript对象是否有不需要的属性 我想出了以下片段: function strip(object, schema) { var strippedObject = {}; for (var property in schema.properties) { if (schema.properties[property].type === 'object') { strippedObject

我想用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);
    });
}

这看起来真的很混乱,但它工作正常并且通过了测试。您觉得这个解决方案怎么样?

对于大型复杂对象图来说,它是不可忽略的,因为它是递归的。由于它是递归的,您可以轻松地将调用下一个递归封装在setTimeout或setImmediate中,以释放事件循环


回复:从性能的角度来看,编辑这个看起来不错。看起来可以对其进行重构以使其更具可读性,但我认为您对问题域和您精心设计的解决方案有着坚实的掌握。

除非该模式有数千个属性,否则它不应该是一个问题。在“标准环境”中,尝试测量最坏情况下subrutine所用的时间。如果该时间不可接受,您可以将该循环拆分为多个部分。请参见

+1了解设置即时。它本质上接受递归调用并将其放在循环堆栈的末尾,这样它可以保持它在循环中的位置,但允许它首先阻止的任何其他内容。这是关于节点的,而不是浏览器,但您可能是对的,因为模式很小。