合并选项javascript对象与递归

时间:2014-08-15 15:27:26

标签: javascript jquery

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

例如:

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;
}

此函数也是一个但是它在第二个循环中将undefined添加到现有字符串中。不知道为什么。

任何想法如何创建这样的功能?

1 个答案:

答案 0 :(得分:1)

如果从基础案例(非对象)开始编写递归函数,事情会变得更容易

// 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;

    }
}