Javascript 基于另一个对象递归更新特定键的嵌套对象值
***更新的对象结构*** 我想从UpdatengObject中存在的属性递归更新mainObject的属性值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
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}
},
爱好:{
山地相关:[“徒步旅行”、“滑雪板”]
}
}
让我们更新