Я хочу добавить ссылку на узел root дерева для каждого узла в дереве, но я хочу избавиться от циклических ссылок.
Для родителей я использовал Map
, связывающий экземпляр с его родителем, и свойства get
и set
, чтобы остановить циклическую ссылку. Есть ли способ, кроме как повторять один и тот же шаблон, чтобы дать ленивую ссылку на узел root?
Помимо этого, я хочу иметь возможность иметь несколько экземпляров дерева для целей тестирования, поэтому я думаю, Мне нужно добавить ссылку на root, или я должен просто пройти вверх, пока родители не будут установлены?
Я прикрепил MVP, чтобы помочь вам проиллюстрировать ваш ответ и показать вам, в основном, что Я работаю с.
Спасибо за любую помощь!
const parents = new Map
const root = new Map
const uuid = ((id) => () => id++)(0)
const findRoot = node => node.parent ? findRoot(node.parent) : node
class Node {
constructor(nodes = []) {
this.nodes = nodes
}
init() {
this.id = uuid()
this.nodes.forEach(node => {
node.parent = this
node.init()
})
return this
}
get parent() {
return parents.get(this)
}
set parent(parent) {
parents.set(this, parent)
}
get root() {
return root.has(this)
? root.get(this)
: root.set(this, findRoot(this)), root.get(this)
}
}
const app = new Node([
new Node([
new Node([]) // <-- I want to access the root from a child
])
])
app.init()
console.log(
app
)