【问题标题】:merge options javascript objects with recursion使用递归合并选项 javascript 对象
【发布时间】:2014-08-15 15:27:25
【问题描述】:

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

例如:

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

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

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

【问题讨论】:

标签: javascript jquery


【解决方案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;

    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-07
    • 2020-08-04
    • 1970-01-01
    • 1970-01-01
    • 2019-05-08
    • 1970-01-01
    • 2020-06-02
    • 2020-01-26
    相关资源
    最近更新 更多