Вы можете использовать обычные решения , но со специальным c регулярным выражением, которое должным образом работает с скобками, позволяя использовать точки в именах свойств:
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));