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

基于键数组设置第n层子对象值的实现问题

解决方案

你遇到的问题核心是:直接给accessor变量赋值只会改变变量本身,不会修改原对象的属性——因为变量存的是属性的值(或者说对值的引用,而非对父对象属性的引用)。要实现深层赋值,关键是找到目标属性的父对象,然后直接修改父对象的对应键。

下面是两种通用实现方式,无需按数组长度做分支判断:

方法一:循环遍历到父对象

function setNestedValue(obj, keys, value) {
  // 提取除最后一个键外的所有键,用来定位父对象
  const parentKeys = keys.slice(0, -1);
  let parent = obj;
  
  // 逐步深入到目标属性的父对象
  for (const key of parentKeys) {
    // 若父对象中不存在该键,可按需初始化空对象(根据业务场景调整)
    if (!parent[key]) {
      parent[key] = {};
    }
    parent = parent[key];
  }
  
  // 给父对象的最后一个键赋值,直接修改原对象
  parent[keys[keys.length - 1]] = value;
}

// 使用示例
const pivot = {};
setNestedValue(pivot, ['rotation'], 90);
console.log(pivot.rotation); // 输出 90

setNestedValue(pivot, ['rotation', 'y'], 180);
console.log(pivot.rotation.y); // 输出 180

方法二:用reduce简化遍历

function setNestedValue(obj, keys, value) {
  const lastKeyIndex = keys.length - 1;
  // 通过reduce遍历到父对象
  const parent = keys.slice(0, lastKeyIndex).reduce((current, key) => {
    if (!current[key]) current[key] = {};
    return current[key];
  }, obj);
  
  parent[keys[lastKeyIndex]] = value;
}

原理说明

两种方法的核心逻辑一致:

  1. 分离出「父对象的路径键」和「最后一个目标键」
  2. 遍历父路径键,拿到目标属性所在的父对象
  3. 直接给父对象的目标键赋值,这样修改会同步到原对象上

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 22:32:05