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