通用方法实现嵌套对象属性的访问与值更新
实现通用的嵌套对象属性更新方法
嘿,我来帮你搞定这个通用的嵌套对象属性更新方法!你需要的是一个能接收对象、点分隔的属性路径和新值,然后更新对应属性并返回修改后对象的函数,对吧?
方法实现思路
核心思路是把点分隔的属性路径拆分成数组,然后逐层遍历对象找到目标属性的父层级,最后给目标属性完成赋值。同时我们可以处理中间层级属性不存在的情况,避免报错(这个逻辑可选,可根据需求调整)。
完整代码实现
function updateProperty(obj, path, value) { // 将属性路径按点分割成数组,比如'marks.sub1'转为['marks', 'sub1'] const propPath = path.split('.'); let currentLayer = obj; // 遍历到倒数第二个属性,定位到目标属性的父层级 for (let i = 0; i < propPath.length - 1; i++) { const currentProp = propPath[i]; // 如果当前层级的属性不存在或不是对象,自动创建空对象(可根据需求移除该逻辑) if (!currentLayer[currentProp] || typeof currentLayer[currentProp] !== 'object') { currentLayer[currentProp] = {}; } currentLayer = currentLayer[currentProp]; } // 给最后一个属性赋值 const targetProp = propPath[propPath.length - 1]; currentLayer[targetProp] = value; // 返回修改后的原对象(对象是引用类型,原对象已被修改,返回方便链式调用) return obj; }
测试示例
用你提供的student对象来测试:
var student = { name: 'Tom', address: { pincode: 43301, street: '12th Main', city: 'Some city', }, marks: { sub1: 111, sub2: 222 } }; // 更新marks.sub1为125 const updatedStudent = updateProperty(student, 'marks.sub1', 125); console.log(updatedStudent.marks.sub1); // 输出: 125 console.log(student.marks.sub1); // 同样输出125(对象是引用类型,原对象已被修改) // 测试更新更深层级的属性 updateProperty(student, 'address.pincode', 43302); console.log(student.address.pincode); // 输出: 43302
额外说明
- 如果不需要自动创建不存在的中间属性,只需要删除
if (!currentLayer[currentProp]...)这段逻辑即可,此时如果路径中的中间属性不存在,会直接报错(符合严格场景需求)。 - 这个方法会直接修改原对象(因为JS对象是引用类型),如果需要返回一个新的对象而不修改原对象,可以在函数开头深拷贝原对象,再对拷贝后的对象进行操作(比如用
JSON.parse(JSON.stringify(obj))或者自定义递归深拷贝函数)。
内容的提问来源于stack exchange,提问作者Lakshman Kumar
相关产品推荐
相关产品推荐

