javascript - 有没有办法在变量中存储对深层对象键的引用?
问题描述
给出以下示例:
const a = {
b: {
c: null
}
};
let d = ["b", "c"];
let reference = a;
d.forEach(key => (reference = reference[key]));
reference = "fe";
console.log("With a reference to the object deep key.");
console.log(a);
a["b"]["c"] = "fe";
console.log("Directly setting it, what I want.");
console.log(a);
是否可以通过c
引用来更改 的值?这是我最接近的,但它显然存储了null
它的价值。
解决方案
您需要pop
从最后一个键开始d
并在最后使用它reference
。
let d = ["b", "c"],
last = d.pop(),
reference = a;
path.forEach(key => reference = reference[key] || {});
reference[last] = "fe";
您可以使用reduce
在累加器中获取对象的引用并last
使用提供的值更新键
function updatePath(original, path, value) {
const last = path.pop();
path.reduce((acc, key) => acc[key] || {}, original)[last] = value;
return original
}
const eg1 = {
b: {
c: null
}
}
console.log(
updatePath(eg1, ['b', 'c'], 'fe')
)
const eg2 = {
1: {
2: {
3: 'initial'
}
}
}
console.log(
updatePath(eg2, ['1', '2', '3'], 'updatedValue')
)
推荐阅读
- docker - 当 dockerfile 在项目内的文件夹中并且解决方案包含多个项目时运行 docker
- php - 使用 CakePHP 4 发送电子邮件
- notepad++ - 删除记事本++中两个字符之间的单个空格
- cplex - 有人在 OPL 中使用过 Ford Fulkerson 算法吗?
- c# - 如果身份服务器发现文档无法访问,则处理错误
- asp.net-core - endpoints.MapFallbackToFile("index.html") 弄乱了 asp.net 核心项目中的路由
- python - 将火花流写入 Mongodb 接收器的问题
- python - Tkinter 按钮中的命令是否存储在按钮中?
- amazon-web-services - 如何在 Lambda 中读取任何事件的标签(AWS 服务)
- flutter - 无法在 AppBar Flutter 中放置图像和文本