Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/9.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_Oop_Recursion - Fatal编程技术网

Javascript 基于另一个对象递归更新特定键的嵌套对象值

Javascript 基于另一个对象递归更新特定键的嵌套对象值,javascript,oop,recursion,Javascript,Oop,Recursion,***更新的对象结构*** 我想从UpdatengObject中存在的属性递归更新mainObject的属性值 let mainObject = { age: 24, isMarried: false, pets: { dog: { name: "Juniper", age: 3 }, cat: { name: "Spasia", age: 7 } }, hob

***更新的对象结构***

我想从UpdatengObject中存在的属性递归更新mainObject的属性值

let mainObject = {
  age: 24,
  isMarried: false,
  pets: {
    dog: {
      name: "Juniper",
      age: 3
    },
    cat: {
      name: "Spasia",
      age: 7
    }
 },
 hobbies: {
    mountainRelated: ["hiking", "snowboarding"]
 }
}

let updatingObject = {
   pets: {
      cat: {
         age: 8
      }
   }
}
我为下面的问题添加了一个代码笔链接:我仍然需要做的是找到要更新的正确属性(例如,“age”属性对于更多对象来说很常见)

TL;DR:主对象中的猫年龄应为8岁


下面的方法解决了这个问题,首先构造对象属性的访问路径,然后根据从
更新对象
构造的访问路径访问和修改
main对象

let main对象={
年龄:24岁,
我结婚了:错,
宠物:{
狗:{
名称:“Juniper”,
年龄:3岁,
},
类别:{
名称:“痉挛”,
年龄:7岁,
},
},
爱好:{
山地相关:[“徒步旅行”、“滑雪板运动”],
},
};
让更新对象={
宠物:{
类别:{
年龄:8岁,
},
},
爱好:{
山地相关:[“骑自行车”],
无:“未更新”,
},
};
函数updateGivenObject(mainObject,UpdateObject){
常量mainObjPaths=[];
常量updateObjPath=[];
构建路径(mainObject、mainObjPath);
构建路径(更新对象,更新对象路径);
log('mainObjPaths:',mainObjPaths);
log('updateObjPath:',updateObjPath');
updateObjPaths.forEach(路径=>{
const newValue=getPropByPath(更新对象,路径);
setPropByPath(主对象、路径、新值);
});
}
函数构建路径(obj、累计路径、当前路径=[])){
Object.keys(obj.map)(key=>{
如果(对象的类型[键]!==‘对象’){
累计路径。推送([…当前路径,键)。加入('.');
}否则{
构建路径(obj[key],累计路径,[…当前路径,key]);
}
});
}
函数getPropByPath(对象,路径){
const pathArr=path.split('.');
设值=obj;
路径arr.forEach(键=>{
值=值[键];
});
返回值;
}
函数setPropByPath(对象、路径、新值){
const pathArr=path.split('.');
设值=obj;
pathArr.forEach((键,idx)=>{
如果(值[键]==未定义){
返回;
}
if(idx==pathArr.length-1){
值[键]=新值;
}否则{
值=值[键];
}
});
返回值;
}
updateGivenObject(主对象、UpdateObject);
console.log(main对象);
日志(mainObject.pets.cat.age);
console.log(mainObject.嗜好.mountainRelated[0]);

console.log(mainObject.cabiods.none)
下面的方法解决了这个问题,首先构造对象属性的访问路径,然后根据
updateingobject
构造的访问路径访问和修改
main对象

let main对象={
年龄:24岁,
我结婚了:错,
宠物:{
狗:{
名称:“Juniper”,
年龄:3岁,
},
类别:{
名称:“痉挛”,
年龄:7岁,
},
},
爱好:{
山地相关:[“徒步旅行”、“滑雪板运动”],
},
};
让更新对象={
宠物:{
类别:{
年龄:8岁,
},
},
爱好:{
山地相关:[“骑自行车”],
无:“未更新”,
},
};
函数updateGivenObject(mainObject,UpdateObject){
常量mainObjPaths=[];
常量updateObjPath=[];
构建路径(mainObject、mainObjPath);
构建路径(更新对象,更新对象路径);
log('mainObjPaths:',mainObjPaths);
log('updateObjPath:',updateObjPath');
updateObjPaths.forEach(路径=>{
const newValue=getPropByPath(更新对象,路径);
setPropByPath(主对象、路径、新值);
});
}
函数构建路径(obj、累计路径、当前路径=[])){
Object.keys(obj.map)(key=>{
如果(对象的类型[键]!==‘对象’){
累计路径。推送([…当前路径,键)。加入('.');
}否则{
构建路径(obj[key],累计路径,[…当前路径,key]);
}
});
}
函数getPropByPath(对象,路径){
const pathArr=path.split('.');
设值=obj;
路径arr.forEach(键=>{
值=值[键];
});
返回值;
}
函数setPropByPath(对象、路径、新值){
const pathArr=path.split('.');
设值=obj;
pathArr.forEach((键,idx)=>{
如果(值[键]==未定义){
返回;
}
if(idx==pathArr.length-1){
值[键]=新值;
}否则{
值=值[键];
}
});
返回值;
}
updateGivenObject(主对象、UpdateObject);
console.log(main对象);
日志(mainObject.pets.cat.age);
console.log(mainObject.嗜好.mountainRelated[0]);

console.log(mainObject.cabiods.none)您可以同步遍历

let main对象={
年龄:24岁,
我结婚了:错,
宠物:{
狗:{名字:“刺柏”,年龄:3},
猫:{姓名:“痉挛”,年龄:7}
},
爱好:{
山地相关:[“徒步旅行”、“滑雪板”]
}
}
让更新对象={
宠物:{
类别:{
年龄:8岁,
姓名:“加布里埃尔”
}
}
}
函数updateObject(目标,更新){
//对于更新对象中的每个键/值对
对象项(更新)的([键,值]){
//如果目标公司拥有相关的密钥和
//目标和更新中的类型相同
if(target.hasOwnProperty(key)和&typeof(value)==typeof(target[key])){
//如果是字符串、数字或布尔值,则更新值
if(['string','number','boolean'].includes(值的类型)| | Array.isArray(值)){
目标[键]=值;
}否则{
//如果类型是object,则再深入一层
如果(值的类型==='object'){
updateObject(目标[键],值)
}
}
}
}
}
updateObject(mainObject,updateObject)

console.log(main对象)您可以同步遍历

let main对象={
年龄:24岁,
我结婚了:错,
宠物:{
狗:{名字:“刺柏”,年龄:3},
猫:{姓名:“痉挛”,年龄:7}
},
爱好:{
山地相关:[“徒步旅行”、“滑雪板”]
}
}
让我们更新