对象合并后,forEach不是函数

时间:2015-07-08 01:42:05

标签: javascript

我基于This question创建了这个方法,我将其修改为递归。它似乎有效,但我遇到的问题是我收到的错误是:

  

未捕获的TypeError:this.config.routes.forEach不是函数

var obj = {
    config: {
        maxLoadLoop: 5,
        author: {color: "red"}
    },
    run: function(settings){
        this.config = this.mergeOptions(this.config, settings);
        this.config.routes.forEach(function(){/* do some stuff */});
    },
    mergeOptions: function(obj1, obj2){
        var obj3 = {};
        for(var attrname in obj1){
            obj3[attrname] = obj1[attrname];
        }
        for(var attrname in obj2){
            if(Array.isArray(obj2[attrname]) || typeof obj2[attrname] === "object"){
                obj3[attrname] = this.mergeOptions(obj3[attrname], obj2[attrname]);
            }else{
                obj3[attrname] = obj2[attrname];
            }
        }
        return obj3;
    }
};

obj.run(myCustomSettings);

我正在合并以下两个对象:

{
    maxLoadLoop: 5,
    author: {color: "red"}
}

和这个(json转换为对象):

{
    "author": {
        "name": "Me",
        "email": "my email"
    },
    "routes": [
        {
            "route": "/home",
            "template": "/templates/home.html",
            "default": true
        },
        {
            "route": "/games",
            "template": "/templates/games.html"
        }
    ]
}

这两个似乎合并得很好,除了我得到上面提到的错误......

1 个答案:

答案 0 :(得分:3)

我改变了第2行:

var obj3 = (!obj1 && Array.isArray(obj2)) ? [] : {};

如果我们遇到obj1不存在而且obj2是一个数组,那么输出也应该是一个数组。

如果你想处理obj1和obj2都是数组的情况,你需要多做一些工作。