如何将两个或多个对象的内容合并到第一个对象中

时间:2012-07-02 12:24:35

标签: javascript jquery object

您好我试图修改object形式的另一个object

的值

这是我需要修改的内容:

  y = {name:'m' , age:'28' , g:{m:'n' , f:'y' , k:'n' ,
       other :{x:'f' , y:'m'}} , h:'6' , zip :'12345' } ;

以下对象将在object y中循环,如果找到任何匹配的元素,则会更改其值以匹配对象x

   ​x = {name :'y' , age:'17' , g :{m:'y' ,f:'n'}} ;

代码

  for(var i in x){
     for(var o in y){
        if(i == o) y[o] = x[i] ; 
            }
      }

当此代码运行时,它会更改y.(name and age )的值,保留h and zip值,因为它很棒

问题位于g对象,它只会更改g.ng.f的值,并删除其余的g object element

jsFiddle example

我希望得到的是

  y = {name:'y' , age:'17' , g:{m:'y' , f:'n' , k:'n' ,
   other :{x:'f' , y:'m'}} , h:'6' , zip :'12345' } 

我正在使用jquery所以如果有任何jquery函数可以帮助那么好

3 个答案:

答案 0 :(得分:3)

您可以将jQuery.extenddeep参数一起使用:

  

将两个或多个对象的内容合并到第一个对象中   对象

     

[...]

     

默认情况下,$ .extend()执行的合并不是递归的。如果一个   第一个对象的属性本身就是一个对象或数组,它将是   被第二个中具有相同键的属性完全覆盖   宾语。值未合并。 [...]然而,通过传递真实   第一个函数参数,对象将以递归方式合并。   (不支持为第一个参数传递false。)

var y = {
    name: 'm',
    age: '28',
    g: {
        m: 'n',
        f: 'y',
        k: 'n',
        other: {
            x: 'f',
            y: 'm'
        }
    },
    h: '6',
    zip: '12345'
};
var x = {
    name: 'y',
    age: '17',
    g: {
        m: 'y',
        f: 'n'
    }
};
$.extend(true, y, x);
console.log(y);
// {
//     "name": "y",
//     "age": "17",
//     "g": {
//         "m": "y",
//         "f": "n",
//         "k": "n",
//         "other": {
//             "x": "f",
//             "y": "m"
//         }
//     },
//     "h": "6",
//     "zip": "12345"
// }

答案 1 :(得分:2)

结果符合预期,因为您正在循环并比较xy的属性,如果值不相等,您将替换y中的属性值使用x

中的属性值

,在这种情况下y.g == x.g为假,因为有不同的对象 所以y.g将被替换为x.g。

试试这个:

function compare(x, y) {

    for (var i in x) {
        for (var o in y) {
            if(typeof i == "object")
            {
                compare(i,o);
            }else{
                if (i == o) y[o] = x[i];
            }
        }
    }
}

compare(x,y);

http://jsfiddle.net/9qkQ8/3/

答案 2 :(得分:0)

|我正在使用jquery所以如果有任何jquery函数可以帮助那么好

看看jQuery.extend

$.extend(true, y, x);