繁体   English   中英

JavaScript:更改深度嵌套 object 给定路径的所有值

[英]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)内所有keysvalues ,但不更改其他值。

首先,我认为您没有多次使用相同密钥的 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM