递归未完全遍历具有嵌套对象的对象

时间:2015-02-22 00:09:01

标签: javascript recursion tree-traversal

我打算编写一个可以使用默认配置实例化的模块,然后在初始化时使用自定义配置覆盖。配置对象具有嵌套对象,因此如果它们包含在自定义配置中,我需要遍历这些嵌套对象。我试图通过递归调用customize来做到这一点。这适用于第一个嵌套对象,但遍历在该对象之后结束。为什么这样做以及如何完全遍历包含嵌套对象的对象?

function Config(options) {

    function customize(conf) {
        if (conf && conf.constructor === Object) {
            for (var prop in conf) {         
                if(conf[prop].constructor === Object) {
                    return customize.call(this[prop], conf[prop]);
                } else {
                    if (this.hasOwnProperty(prop)){
                        this[prop] = conf[prop];
                    }
                }
            }
        } else {
            console.error('The first argument must be an object.');
            return;                
        }
    }

    //Default config values
    this.foo = 'default';
    this.bar = {
        foo: 'default'    
    };
    this.baz = {
        foo: 'default'
    };

    //Overide default config with custom config
    if (options && options.constructor === Object) {
        customize.call(this, options);
    }
}  

function TestModule(){        
    this.init = function(options){
        this.config = (options && options.constructor === Object) ? new Config(options) : new Config();
        return this;
    };
}

console.log(
    new TestModule().init({
        foo: 'custom',
        bar: {foo: 'custom'},
        baz: {foo: 'custom'}
    }).config
);

//RESULT
// {
//     foo: 'custom',
//     bar: {foo: 'custom'},
//     baz: {foo: 'default'}
// }

1 个答案:

答案 0 :(得分:2)

这一行:

return customize.call(this[prop], conf[prop]);

发生在for循环中,因此在迭代每个项之前返回。你的return语句应该在循环之外。