如何在TypeScript对象中替换指定路径的嵌套对象
精准修改TypeScript对象中指定路径的属性
需求说明
现有如下TypeScript对象:
const originalObj = { requirements: { general_info: { aircraft: { payload: { '@_unit': 'kg' }, autopilot_ratio: '', }, power: { number_of_engines: '', }, geometrical: { payload: { '@_unit': 'kg' }, design_approach: { target: '' }, }, }, }, };
需要将requirements.general_info.aircraft.payload路径下的对象修改为{ '@_unit': 'hg', '#text': 3000},最终得到目标对象:
const targetObj = { requirements: { general_info: { aircraft: { payload: { '@_unit': 'hg', '#text': 3000}, autopilot_ratio: '', }, power: { number_of_engines: '', }, geometrical: { payload: { '@_unit': 'kg' }, design_approach: { target: '' }, }, }, }, };
之前编写的递归函数会修改所有同名的payload键,还存在嵌套对象重复插入的问题,需要实现通过完整路径精准定位并修改的方法。
解决方案
通过拆分路径字符串,逐层遍历对象找到目标节点后再修改,避免无差别遍历所有键。以下是实现函数:
const updateObjectByPath = (obj: any, path: string, newProps: any): void => { // 将路径拆分为单个键的数组 const keys = path.split('.'); // 遍历到目标节点的父级对象 const targetParent = keys.slice(0, -1).reduce((current, key) => { return current[key]; }, obj); // 获取目标节点的键名 const targetKey = keys[keys.length - 1]; // 合并原有属性与新属性(若需完全替换,直接赋值targetParent[targetKey] = newProps即可) targetParent[targetKey] = { ...targetParent[targetKey], ...newProps }; }; // 使用示例 updateObjectByPath(originalObj, 'requirements.general_info.aircraft.payload', { '@_unit': 'hg', '#text': 3000 }); console.dir(originalObj, { depth: null });
函数说明
path参数传入以.分隔的完整属性路径,精准定位目标节点newProps传入需要修改或新增的属性,函数默认合并原有属性与新属性,可根据需求改为直接替换- 仅修改指定路径下的对象,不会影响其他同名键的节点
注意事项
- 需确保传入的路径有效,否则会触发
Cannot read properties of undefined错误,可根据需求添加路径有效性校验逻辑 - 若不想修改原对象,可先对原对象进行深拷贝(如使用
structuredClone),再对拷贝后的对象执行修改操作
内容的提问来源于stack exchange,提问作者3corex
相关产品推荐
相关产品推荐

