![](/img/trans.png)
[英]good way to return all deeply object's nested keys with values in javascript
[英]JavaScript: Change All Values of Deeply nested object given path
我有一个 JavaScript Object 像这样:
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.Level3_1 object(即所有 level4)内所有keys
的values
,但不更改其他值。
首先,我认为您没有多次使用相同密钥的 object。 我认为它只是为了展示不同的属性。 如果您想保持 object 不可变,您可以这样做:(但这取决于您的用例)。
不是 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> } } } }
您可以递归地遍历 object 属性,同时跟踪剩余的路径属性,如果到达最后一个并且它存在,则可以更改所有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>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.