JavaScript:改变深度嵌套对象给定路径的所有值



我有一个这样的JavaScript对象:

const Obj = {
level1_1: "Value1",
level1_2: "Value2",
level1_3: "Value3",
level1_4: "Value4",
level1_5: {
level2_1: {
level3_1: { level4_1:1, level4_2:2, level4_3:3, level4_4:4 },
level3_2: { level4_a:1, level4_b:2, level4_c:3, level4_d:4 } 
},
level2_2: {
level3_1: { level4_5:1, level4_6:2, level4_7:3, level4_8:4 },
level3_2: { level4_e:1, level4_f:2, level4_g:3, level4_h:4 } 
}
}
};

我想改变level1_5.level2_1中所有keysvalues。Level3_1对象(即。所有level4)动态,但不包括其他值。

您可以在跟踪剩余路径属性的同时递归地遍历对象属性,如果到达最后一个并且它存在,则可以更改所有values:

const Obj = {
level1_1: "Value1",
level1_2: "Value2",
level1_3: "Value3",
level1_4: "Value4",
level1_5: {
level2_1: {
level3_1: { level4_1:1, level4_2:2, level4_3:3, level4_4:4 },
level3_2: { level4_a:1, level4_b:2, level4_c:3, level4_d:4 } 
},
level2_2: {
level3_1: { level4_5:1, level4_6:2, level4_7:3, level4_8:4 },
level3_2: { level4_e:1, level4_f:2, level4_g:3, level4_h:4 } 
}
}
};
function getUpdatedObject (obj = {}, path = [], newVal) {
const targetLevel = path.length;
return (function setValuesOfPath (obj, path, newVal, currentLevel = 1) {
if(currentLevel === targetLevel && path.length === 1) {
const target = obj[path[0]];
if(target) Object.keys(target).forEach(key => target[key] = newVal);
}
for (var property in obj) {
if (obj.hasOwnProperty(property)) {
if (typeof obj[property] === "object") {
if(property === path[0]) path.shift();
setValuesOfPath(obj[property], path, newVal, currentLevel+1);
}
}
}
return obj
}(obj, path, newVal));
}
console.log(getUpdatedObject(Obj, ["level1_5", "level2_1", "level3_1"], "a"));

使用lodash:

let Obj = {
level1_1: "Value1",
level1_2: "Value2",
level1_3: "Value3",
level1_4: "Value4",
level1_5: {
level2_1: {
level3_1: { level4_1:1, level4_2:2, level4_3:3, level4_4:4 },
level3_2: { level4_a:1, level4_b:2, level4_c:3, level4_d:4 } 
},
level2_2: {
level3_1: { level4_5:1, level4_6:2, level4_7:3, level4_8:4 },
level3_2: { level4_e:1, level4_f:2, level4_g:3, level4_h:4 } 
}
}
};
const setValuesOfPath = (obj = {}, path = [], newVal) => {
const target = _.get(obj, path.join('.'));
if(target) Object.keys(target).forEach(key => target[key] = newVal);
return obj;
}
console.log(setValuesOfPath(Obj, ["level1_5", "level2_1", "level3_1"], "a"));
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.20/lodash.min.js" integrity="sha512-90vH1Z83AJY9DmlWa8WkjkV79yfS2n2Oxhsi2dZbIv0nC4E6m5AbH8Nh156kkM7JePmqD6tcZsfad1ueoaovww==" crossorigin="anonymous"></script>

首先,我不认为你有一个对象具有相同的键多次。我想这只是为了展示不同的属性。如果你想保持对象不可变,你可以这样做:(但这取决于你的用例)

不是100%确定动态是什么意思?!

Obj = {
level1:"Value1",
level11:"Value2",
level12:"Value3",
level13:"Value4",
level14:{
level2:{
level3:{
level4:Number,
level4:Number,
level4:Number,
level4:Number,
} 
}
},
}

Obj = {
...Obj
level14: {
...Obj.level14
level2: {
...Obj.level14.level2
level3: {
level4: <your new number>
level41: <your new number>
}
}
}
}

最新更新