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

JavaScript中如何根据键路径数组动态修改对象属性值?

动态修改嵌套对象属性的通用方案

可以写一个通用函数来处理任意层级的键路径,核心思路是逐层遍历键路径,定位到最后一层属性后完成赋值。

通用实现函数

function setNestedValue(obj, keys, value) {
  // 遍历到倒数第二个键,确保每一层对象都存在(可选自动创建空对象)
  for (let i = 0; i < keys.length - 1; i++) {
    const key = keys[i];
    // 如果当前层级不存在,自动创建空对象(按需保留,不需要可删除)
    if (!obj[key]) {
      obj[key] = {};
    }
    obj = obj[key];
  }
  // 给最后一个键赋值
  obj[keys[keys.length - 1]] = value;
}

结合你的场景使用

注意你的api_response.key包含了根对象名settings,但目标修改对象就是settings本身,所以需要跳过第一个键:

var api_response = { key: "settings.options.height", val: 500 };
var keys = api_response.key.split('.');
var settings = { options: { height: 0 } };

// 调用函数,用slice(1)跳过第一个"settings"键
setNestedValue(settings, keys.slice(1), api_response.val); 

console.log(settings.options.height); // 输出 500

扩展优化

  1. 支持直接传入字符串路径:不用提前拆分键路径,让函数兼容字符串和数组两种格式:
function setNestedValue(obj, keyPath, value) {
  const keys = typeof keyPath === 'string' ? keyPath.split('.') : keyPath;
  for (let i = 0; i < keys.length - 1; i++) {
    const key = keys[i];
    if (!obj[key]) obj[key] = {};
    obj = obj[key];
  }
  obj[keys[keys.length - 1]] = value;
}

// 直接传字符串路径调用
setNestedValue(settings, "options.height", api_response.val);
  1. 兼容数组索引:如果键路径包含数组(比如"list.0.name"),可以调整逻辑自动识别数组索引:
function setNestedValue(obj, keyPath, value) {
  const keys = typeof keyPath === 'string' ? keyPath.split('.') : keyPath;
  for (let i = 0; i < keys.length - 1; i++) {
    const key = keys[i];
    const isArrayIndex = !isNaN(parseInt(key));
    if (!obj[key]) {
      obj[key] = isArrayIndex ? [] : {};
    }
    obj = obj[key];
  }
  obj[keys[keys.length - 1]] = value;
}
  1. 禁止自动创建层级:如果不需要自动生成不存在的中间对象,直接删除if (!obj[key]) obj[key] = {};这行即可,此时若路径不存在会报错,可按需添加错误捕获逻辑。

内容的提问来源于stack exchange,提问作者Dooplerangel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 09:45:39