javascript - 使用动态变量访问javascript对象中的第n级嵌套属性
问题描述
假设我有一个对象
const aggs = {
cat.id: {
terms: { field: 'cat.id', size: 10 },
aggs: { cat.label: {field: 'cat.label', size: 5} }
}
}
在我有的动态变量中
const key = '[cat.id].aggs'
现在我需要使用动态变量访问 aggs 对象中的属性 aggs
aggs[key]
这不起作用,如何动态访问嵌套属性?显然像这样直接访问它有效
aggs['cat.id'].aggs
解决方案
您可以使用通常的解决方案,但使用适当处理括号的特定正则表达式,允许属性名称中的点:
const pathToArray = path =>
Array.from(path.matchAll(/\[(.*?)\]|[^.[]+/g) || [],
([prop, inbrackets]) => inbrackets || prop);
function deepGet(obj, path, defaultVal = null) {
for (let prop of pathToArray(path)) {
if (!(prop in obj)) return defaultVal;
obj = obj[prop];
}
return obj;
}
function deepSet(obj, path, value) {
let arr = pathToArray(path);
arr.slice(0, -1).reduce((a, c, i) =>
Object(a[c]) === a[c] ? a[c] :
a[c] = Math.abs(path[i + 1]) >> 0 === +path[i + 1] ? [] : {},
obj)[arr[arr.length - 1]] = value;
return obj;
}
// Your example:
const aggs = {"cat.id": {terms: {field: "cat.id",size: 10},aggs: {"cat.label": {field: "cat.label",size: 5}}}};
const key = "[cat.id].aggs";
console.log(deepGet(aggs, key));
deepSet(aggs, key, "hello");
console.log(deepGet(aggs, key));
推荐阅读
- python - 在 Pandas 数据框列字符串中为每个字符插入空格
- php - Wordpress 页面正在检索旧数据
- python - 如何将特定项目与功能相关联?
- error-handling - Stripe webhook 失败 - Webhook 错误:504
- java - 当我在终端中打印出来时,我的输出后面总是有一个“%”。如何解决?
- html - HTML 单选按钮,如条形图和相应标签,就像 X 轴名称一样位于它们的右下方
- spring - 如何将变量从@controller 传递给@controlleradvice
- python - 邻居()函数
- flutter - 颤动中的Gif完成监听器
- postman - 邮递员本地主机服务器未启动