Javascript дерево - доступ к root узлу с листа, если я должен сохранить ссылку на root или пройти вверх по дереву - PullRequest
0 голосов
/ 22 марта 2020

Я хочу добавить ссылку на узел 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
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...