Эта функция не существует в обычном JavaScript, как об этом говорится в комментариях.
Однако ничто не мешает вам добавлять циклические ссылки на ваши объекты, чтобы вы могли достичь чего-то близкого к тому, что вы 'ищу.Вы могли бы даже обернуть это в классе:
class RelPathObj {
constructor(obj) {
function build (parent, parentKey, obj) {
if (typeof obj === "object") {
for (let key in obj) {
if (typeof obj[key] === "object") {
parent[key] = { "..": parent, ...obj[key] };
build(parent[key], key, obj[key]);
} else {
if (key === "$ref") {
const path = obj[key].split("/");
Object.defineProperty(parent[".."],
parentKey,
{
get: function() {
let value = parent[".."];
path.forEach(p => { value = value[p] });
return value;
},
set: function(value) {
let ref = parent[".."];
path.forEach(p => {
if (typeof ref[p] === "object")
ref = ref[p]
else
ref[p] = value
});
}
});
} else {
parent[key] = obj[key];
}
}
}
} else {
parent = obj;
}
}
this.root = {};
build(this.root, "root", obj);
}
}
const relativePathObject = new RelPathObj({
"one": {
"two": {
"three": {
"four": {
"five": {
"fiveLevel1": {
"name": "foo"
},
"fiveLevel2": {
"name": {
"$ref": "../fiveLevel1/name"
}
}
}
}
}
}
}
});
let fiveLevel1 = relativePathObject["root"]["one"]["two"]["three"]["four"]["five"]["fiveLevel1"];
console.log(fiveLevel1.name);
let fiveLevel2 = fiveLevel1[".."]["fiveLevel2"];
console.log(fiveLevel2.name);
fiveLevel1.name = "bar";
console.log(fiveLevel2.name);
fiveLevel2.name = "baz"
console.log(fiveLevel1.name);
Это далеко, далеко от совершенства, но основная идея здесь состоит в том, чтобы пройтись по свойствам объекта, добавив ссылку на родителя внутри каждого потомка, а затем повторить это рекурсивно.Когда он находит $ref
, он анализирует путь и переводит его в его значение.
Конечно, если иерархия объектов изменится, вам придется исправить родительские ссылки (это то, что вы могли бы реализовать вВаш пользовательский класс).
Запомните: это всего лишь простой фрагмент кода, чтобы показать вам идею того, что вы можете сделать, я не особо задумывался над этим. Не используйте его в производстве .