用递归合并选项javascript对象



我想创建一个函数,从该对象创建一个递归对象。

例如:

var arr1 = { 
'house' : {
   'doors' : 'black',
   'windows' : 'white',
},
'car' : 'audi'
};
var arr2 = { 
'house' : {
   'doors' : 'yellow',
   'windows' : 'red',
},
'car' : 'bmw',
'wife' : 'hot'
};
and as result I want to get:
arr3 = { 
'house' : {
   'doors' : 'black yellow',
   'windows' : 'white red',
},
'car' : 'audi bmw',
'wife' : 'hot'
};

我有一个函数,它结合了两个对象,但如果一些值是对象,我怎么能做到呢?

function mergeOptions(obj1,obj2){
    var obj3 = {};
    for(var attrname in obj1)
    {
            obj3[attrname] = obj1[attrname];
    }
    for(var attrname in obj2)
    {
        if ( obj3[attrname] != 'undefined')
            obj3[attrname] += ' ' + obj2[attrname];
        else
            obj3[attrname] = obj2[attrname];
        alert( obj1[attrname]);
    }
    return obj3;
}

在这个函数中还有一个but,它在第二个循环中将undefined添加到现有字符串中。不知道为什么。

有什么想法如何创建这样一个函数吗?

如果从基本情况(非对象)开始编写递归函数,事情就容易多了

// receives two things (not only objects)
// returns a merged version of them
function merge(x, y){
    var tx = typeof x;
    var ty = typeof y;
    if(tx !== ty){ /*throw an error*/ }    
    if(tx === 'string'){
        return tx + ' ' + ty;
    }else if (tx === 'number'){
        //???
    }else if (tx === 'object'){
        var out = {};
        for(var k in x){
            if(!y.hasOwnProperty(k)){
                out[k] = x[k];
            }
        }
        for(var k in y){
            if(!x.hasOwnProperty(k)){
                out[k] = y[k];
            }
        }
        for(var k in x){
            if(y.hasOwnProperty(k)){
                out[k] = merge(x[k], y[k]);
            }
        }
        return out;
    }
}

最新更新