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 循环将它们弹出。

  • 使它们成为对象属性并循环访问对象属性。

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

  • 使用下面每个fritz的对象映射

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

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

我不会多想的。只是一个一般的地图功能会做:

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 回答