Javascript 如何将两个或多个对象的内容合并到第一个对象中
您好,我正在尝试将一个Javascript 如何将两个或多个对象的内容合并到第一个对象中,javascript,jquery,object,Javascript,Jquery,Object,您好,我正在尝试将一个对象修改为另一个对象的值 这是我需要修改的: y = {name:'m' , age:'28' , g:{m:'n' , f:'y' , k:'n' , other :{x:'f' , y:'m'}} , h:'6' , zip :'12345' } ; 以下对象将在objecty中循环,如果找到任何匹配的元素,它将更改其值以匹配objectx x = {name :'y' , age:'17' , g :{m:'y' ,f:'n'}} ; 代
对象
修改为另一个对象的值
这是我需要修改的:
y = {name:'m' , age:'28' , g:{m:'n' , f:'y' , k:'n' ,
other :{x:'f' , y:'m'}} , h:'6' , zip :'12345' } ;
以下对象将在object
y
中循环,如果找到任何匹配的元素,它将更改其值以匹配objectx
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.(姓名和年龄)
的值,它保持h和zip的值不变,这很好
问题位于g
object,它只更改g.n
和g.f
的值,并删除g object元素的其余部分
jsFiddle
for(var i in x){
for(var o in y){
if(i == o) y[o] = x[i] ;
}
}
我希望得到的是
y = {name:'y' , age:'17' , g:{m:'y' , f:'n' , k:'n' ,
other :{x:'f' , y:'m'}} , h:'6' , zip :'12345' }
我使用的是jquery,因此,如果有任何jquery函数可以帮助实现这一点,您可以使用deep
参数:
将两个或多个对象的内容合并到第一个对象中
反对
[……]
默认情况下,$.extend()执行的合并不是递归的;如果
第一个对象的属性本身就是一个对象或数组,它将
被第二个中具有相同键的属性完全覆盖
对象这些值不会合并。[…]但是,通过将true传递给
在第一个函数参数中,对象将被递归合并。
(不支持为第一个参数传递false。)
|我使用的是jquery,所以如果有任何jquery函数可以帮助我,那就好了
看一看
结果与预期一样,因为您正在循环和比较x
和y
的属性,如果值不相等,您将用x
中的属性值替换y
中的属性值
在这种情况下,y.g==x.g
为false,因为存在不同的对象
因此,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);
你好,布鲁夫,很好的回答了你的问题,现在阅读问题!递归。你能用jQuery吗?@SalmanA是的,我说我能用jQuery。。。谢谢谢谢,这真是太神奇了。。。但是如果你们能向我们解释为什么上面的代码不起作用,这将是非常棒的,因为你们的代码只提供了属性的一级副本;例如,y.g
属性被x.g
完全覆盖。如果您想自己对解决方案进行编码,则必须检查所分配属性的值是否为对象(typeof x[i]=“object”
);如果是,请将x[i]
的属性逐个复制到y[o]
中。当然,如果x[i],那么您将不得不担心。someProp
它本身是一个对象吗:)这个想法是正确的,但是代码需要改进:在y中不存在的x的属性应该按原样复制到y。
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);