2

您好,我正在尝试修改另一个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 示例

我希望得到的是

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

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

4

3 回答 3

3

您可以使用jQuery.extendwithdeep参数:

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

[...]

$.extend() 执行的合并默认不是递归的;如果第一个对象的属性本身是一个对象或数组,它将被第二个对象中具有相同键的属性完全覆盖。值不会合并。[...] 但是,通过为第一个函数参数传递 true,对象将被递归合并。(不支持为第一个参数传递 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"
// }
于 2012-07-02T12:29:11.277 回答
2

结果与预期一致,因为您正在循环和比较 and 的属性xy如果值不相等,您将用 in 中的属性值替换 in 中y的属性值x

在这种情况下y.g == x.g是错误的,因为有不同的对象,所以 yg 将被替换为 xg

试试这个 :

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/

于 2012-07-02T12:36:34.237 回答
0

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

看看jQuery.extend

$.extend(true, y, x);
于 2012-07-02T12:31:56.617 回答