如何用单个变量访问多层嵌套对象属性且不重写现有函数?
解决嵌套对象属性访问问题(不修改原
access函数) 首先得说,你之前尝试的数组写法不管用是因为对象的方括号访问器会把非字符串的键自动转为字符串——哪怕你传['day', 'time'],object[property]实际会变成object["day,time"],自然找不到对应的属性。
既然你不想修改原access函数的代码,而它又依赖外部的object变量来获取一级属性,那我们可以通过临时替换外部object的方式来间接访问嵌套属性,具体方案如下:
基础实现(针对二级嵌套)
// 先保存原始的全局object,避免影响其他逻辑 const originalObject = object; // 将全局object替换成目标嵌套层级的父对象(也就是object.day) object = object.day; // 现在调用access('time'),内部就会取到object.day.time了 access('time'); // 一定要记得恢复原始的object,防止后续逻辑出错 object = originalObject;
通用封装(支持任意深度嵌套)
如果需要访问更深层级的属性,可以把这个逻辑封装成一个函数,方便复用:
function accessNestedProperty(pathArray) { // 保存原始全局对象 const originalRoot = object; let currentObj = object; // 遍历路径的前n-1层,逐步替换全局object for (let i = 0; i < pathArray.length - 1; i++) { currentObj = currentObj[pathArray[i]]; // 替换全局object为当前层级的子对象 object = currentObj; } // 调用原access函数访问最后一层属性 const result = access(pathArray[pathArray.length - 1]); // 恢复原始全局对象 object = originalRoot; return result; } // 使用示例:访问object.day.time accessNestedProperty(['day', 'time']); // 访问更深层级,比如object.a.b.c.d accessNestedProperty(['a', 'b', 'c', 'd']);
注意事项
这个方法的核心是临时修改全局的object变量,所以要注意:
- 确保在同步场景下使用,如果有异步代码同时操作
object,可能会导致竞态问题 - 一定要记得恢复原始对象,否则会影响其他依赖
object的逻辑
内容的提问来源于stack exchange,提问作者moto
相关产品推荐
相关产品推荐

