如何合并代码|使变量动态

How to consolidate code | making a variable Dynamic

本文关键字:变量 动态 代码 何合并 合并      更新时间:2023-09-26

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

  • 使它们成为对象属性,并在对象属性中循环。

  • 进行函数调用并将它们作为参数传入。

  • 使用下方每个玻璃料的对象图

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

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'

尝试

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

我不会想太多。只要一个通用的映射函数就可以了:

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陷阱(我已经纠正了;))。只关注在这个抽象级别上什么是重要的。