我基于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"
}
]
}
这两个似乎合并得很好,除了我得到上面提到的错误......
答案 0 :(得分:3)
我改变了第2行:
var obj3 = (!obj1 && Array.isArray(obj2)) ? [] : {};
如果我们遇到obj1不存在而且obj2是一个数组,那么输出也应该是一个数组。
如果你想处理obj1和obj2都是数组的情况,你需要多做一些工作。