You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

通用方法实现嵌套对象属性的访问与值更新

实现通用的嵌套对象属性更新方法

嘿,我来帮你搞定这个通用的嵌套对象属性更新方法!你需要的是一个能接收对象、点分隔的属性路径和新值,然后更新对应属性并返回修改后对象的函数,对吧?

方法实现思路

核心思路是把点分隔的属性路径拆分成数组,然后逐层遍历对象找到目标属性的父层级,最后给目标属性完成赋值。同时我们可以处理中间层级属性不存在的情况,避免报错(这个逻辑可选,可根据需求调整)。

完整代码实现

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:10:01