基于键数组设置第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; }
原理说明
两种方法的核心逻辑一致:
- 分离出「父对象的路径键」和「最后一个目标键」
- 遍历父路径键,拿到目标属性所在的父对象
- 直接给父对象的目标键赋值,这样修改会同步到原对象上
内容的提问来源于stack exchange,提问作者narrei
相关产品推荐
相关产品推荐

