Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何最好地比较JavaScript中的两个多级对象以找出差异?_Javascript_Json_Object - Fatal编程技术网

如何最好地比较JavaScript中的两个多级对象以找出差异?

如何最好地比较JavaScript中的两个多级对象以找出差异?,javascript,json,object,Javascript,Json,Object,所以我有一个JavaScript函数,它获取一个对象,并有一个预创建的对象。该函数的目标是将传递对象的所有缺失属性添加到预创建的属性中 当只比较一个级别时,这很容易。例如,为了实现这一点: Precreated: {hello: "world"} Passed: {hello: "there", colour: "green"} Result: {hello: "world", colour: "green"} 您只需查看传递对象的每个键,查看该键是否已存在于预创建的对象中,如果不存在,则

所以我有一个JavaScript函数,它获取一个对象,并有一个预创建的对象。该函数的目标是将传递对象的所有缺失属性添加到预创建的属性中

当只比较一个级别时,这很容易。例如,为了实现这一点:

Precreated: {hello: "world"}  
Passed: {hello: "there", colour: "green"}
Result: {hello: "world", colour: "green"}
您只需查看传递对象的每个键,查看该键是否已存在于预创建的对象中,如果不存在,则将其与相应的值相加

然而,如果你想在多个层次上做这件事,那就有点奇怪了。例如,我希望它能够工作:

Precreated: {hello: {there: true}}
Passed: {hello: {world: true}}
Result: {hello: {there: true, world: true}}
我的想法是,我只需在传递的对象上循环,如果我在其中找到一个对象,则使用该对象再次调用该函数,依此类推,直到该函数处理完所有子对象

但是,当您这样做时,您必须动态地比较两个对象的子对象。比如说,我知道在程序中它有多深,键是什么,等等,我如何通过编程访问它

我这样问是因为我不能硬编码像
if(result[key1][key2][key3]…
,而像
if(result[keys.join(…)]…
这样的东西我认为也不可能


那么,在编写代码时不知道对象的深度有多深的情况下,如何以编程方式访问对象的属性呢?

对@4castle提到的一篇文章的现有答案应该正是您想要的:

我的想法是,我只需在传递的对象上循环,如果我在其中找到一个对象,则使用该对象再次调用该函数,依此类推,直到该函数处理完所有子对象

您已经了解到您想要使用递归,这很好。JavaScript允许您使用
for…in
循环来反映对象的键。您只需要确保要复制的对象确实是一个对象,而不仅仅是一个值


我链接的答案使用它们自己的
isObject
来完成此操作。对象填充是使用
对象递归完成的。分配

您可以使用
for..of
循环,
对象.keys()
要检查传递对象的属性是否为对象,如果为true,则以原始对象、传递对象和传递对象的键为参数递归调用函数,然后将属性分配给原始对象,否则检查原始对象中是否不存在属性,如果为true,则将传递属性分配给原始对象

var precreated1={
您好:{
那是真的
}
};
变量预创建d2={
你好:“世界”
};
功能添加道具(道具、obj、钥匙){
for(让对象的道具。键(道具)){
if(Object.getPrototypeOf(props[prop])==Object.prototype){
添加道具(道具[道具],目标,道具)
}否则{
如果(关键){
obj[key][prop]=道具[prop]
}否则{
如果(!(obj中的道具)){
obj[prop]=道具[prop]
}
}
}
}
}
addProps({
您好:{
世界:真的
}
},预处理1);
console.log(“precreated1:”,precreated1);
addProps({
你好:“那里”,
颜色:“绿色”
},预处理2);

console.log(“precreated2:,precreated2”);
使用递归..可能重复的@baao可能重复的我不只是想比较对象,我想查找和存储不同的可能重复的@baao