0

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);
    });
}

これは非常に面倒に見えますが、機能し、テストに合格します。このソリューションについてどう思いますか?

4

2 に答える 2

1

再帰的であるため、大規模で複雑なオブジェクト グラフでは無視できません。再帰的であるため、次の再帰呼び出しを setTimeout または setImmediate 内で簡単にラップして、イベント ループを解放できます。

Re: 編集 これはパフォーマンスの観点からは良さそうです。読みやすくするためにリファクタリングできるように見えますが、問題のドメインと作成したソリューションをしっかりと把握していると思います。

于 2013-08-14T17:11:51.167 に答える
0

スキーマに何千ものプロパティがない限り、問題にはなりません。「標準環境」で最悪の場合にサブルーチンにかかる時間を測定してみてください。その時間が許容できない場合は、このループを複数の部分に分割できます。実行時間の長い JavaScript によるブラウザのロックを防止するを参照してください。

于 2013-08-14T17:45:37.227 に答える