如何整合代码|制作变量动态

时间:2012-08-05 23:55:01

标签: javascript

我想遍历一个对象并运行所有名为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循环将它们弹出。

  • 使它们成为对象属性并遍历对象属性。

  • 进行函数调用并将其作为参数传递。

  • 在下面的每个fritz中使用对象地图

哪个最好还是有更好的方法?

3 个答案:

答案 0 :(得分:2)

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

ps:检查objectToIterateOver[key].init的类型是否为函数

也许是有意义的
typeof objectToIterateOver[key].init == 'function'

答案 1 :(得分:1)

我不会过分思考它。只需一般的地图功能即可:

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陷阱(我已经纠正过);)。只关注这个抽象层面的重要内容。

答案 2 :(得分: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();
        }
    }
}