0

オブジェクトをループして、init() と呼ばれるすべての関数を実行したいと考えています。

次のコードがありますが、繰り返します。変数の MC および Su インスタンスを効果的に作成するにはどうすればよいですか?

ここに繰り返しコードがあります。

MC.initAll = function() {
    for ( var key in MC ) {
        if( MC.hasOwnProperty( key ) ) {
            if( MC[key].hasOwnProperty( 'init' ) ) {
                MC[key].init();
            }
        }
    }
    for ( var key in Su ) {
        if( Su.hasOwnProperty( key ) ) {
            if( Su[key].hasOwnProperty( 'init' ) ) {
                Su[key].init();
            }
        }
    }
}

多くのオプションがあります...

  • それらを配列に入れてから、for ループを介してポップアウトします。

  • それらをオブジェクト プロパティにし、オブジェクト プロパティをループします。

  • 関数呼び出しを行い、それらをパラメーターとして渡します。

  • 以下のフリッツごとにオブジェクト マップを使用する

どちらが最善か、またはより良い方法がありますか?

4

3 に答える 3

2
function _iterateAndCallInit(objectToIterateOver)
{
    for ( var key in objectToIterateOver ) {
        if( objectToIterateOver.hasOwnProperty( key ) ) {
            if( objectToIterateOver[key].hasOwnProperty( 'init' ) ) {
                objectToIterateOver[key].init();
            }
        }
    }
}

objectToIterateOver[key].initps: の型が関数であるかどうかを確認することも理にかなっています。

typeof objectToIterateOver[key].init == 'function'
于 2012-08-05T23:56:24.657 に答える
1

私はそれを考えすぎません。一般的な map 関数だけで次のことができます。

function object_map(my_object, callback) {
    for (var property in my_object) {
        if (Object.prototype.hasOwnProperty.call(my_object, property)) {
            callback(my_object[property]);
        }
    }
}

object_map(MC, function (item) {
    item.init();
});
object_map(Su, function (item) {
    item.init();
});

これにより、オブジェクト内の要素をループするすべてのオーバーヘッド (および潜在的なhasOwnProperty落とし穴 (私が修正しました;)) が削減されます。そして、この抽象化レベルで重要なことだけに焦点を当てます。

于 2012-08-05T23:57:58.713 に答える
1

試す

var iterate = [MC, Su], l = iterate.length, i, key;
for( i=0; i<l; i++) {
    for( key in iterate[i]) {
        if( iterate[i].hasOwnProperty(key) && iterate[i][key].hasOwnProperty("init")) {
            iterate[i][key].init();
        }
    }
}    
于 2012-08-05T23:58:02.640 に答える