您好我试图修改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.n
和g.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函数可以帮助那么好
答案 0 :(得分:3)
您可以将jQuery.extend
与deep
参数一起使用:
将两个或多个对象的内容合并到第一个对象中 对象
[...]
默认情况下,$ .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)
结果符合预期,因为您正在循环并比较x
和y
的属性,如果值不相等,您将替换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);
答案 2 :(得分:0)