我想遍历一个对象并运行所有名为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中使用对象地图
哪个最好还是有更好的方法?
答案 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();
}
}
}