Java script get root element by recursion

Viewed 404

I need to get the root element for each node.
I have two functions below.
When I ran getRoot I got undefined.
I think the problem is in the recursion function.

ex: for node id=3, I need {id: 1, name: "Business1"}.

//to get the parent for any node
function getParent(id) {
  const node = this._items.find(
    item => item.parent !== undefined && item.id == id
  );
  return node.parent;
}

//to get the root for the node
function getRoot(parent) {
  console.log(this._items);
  this._items.forEach(element => {
    if (element.id == parent) {
      if (element.parent === undefined) return element;
      else return this.getRoot(element.parent);
    }
  });
}
//constant array
const array = [
  {id: 1, name: "Business1"},
  {id: 2, name: "Canton1", parent: 1},
  {id: 3, name: "Branch1", parent: 2},
  {id: 4, name: "Branch2", parent: 2},
  {id: 5, name: "Canton2", parent: 1},
  {id: 6, name: "Branch1", parent: 5},
  {id: 7, name: "Branch2", parent: 5},
  {id: 8, name: "Canton3", parent: 1},
  {id: 9, name: "Branch1", parent: 8},
  {id: 10, name: "Branch2", parent: 8},
  {id: 9, name: "Business2"},
  {id: 10, name: "Canton1", parent: 9},
  {id: 11, name: "Branch1", parent: 10},
  {id: 12, name: "Branch2", parent: 10},
  {id: 13, name: "Canton2", parent: 9},
  {id: 14, name: "Branch1", parent: 13},
  {id: 15, name: "Branch2", parent: 13},
  {id: 16, name: "Canton3", parent: 9},
  {id: 17, name: "Branch1", parent: 16},
  {id: 18, name: "Branch2", parent: 16},
];
2 Answers

const items = [{ id: 1, name: "Business1" },
{ id: 2, name: "Canton1", parent: 1 },
{ id: 3, name: "Branch1", parent: 2 },
{ id: 4, name: "Branch2", parent: 2 },
{ id: 5, name: "Canton2", parent: 1 },
{ id: 6, name: "Branch1", parent: 5 },
{ id: 7, name: "Branch2", parent: 5 },
{ id: 8, name: "Canton3", parent: 1 },
{ id: 9, name: "Branch1", parent: 8 },
{ id: 10, name: "Branch2", parent: 8 },
{ id: 9, name: "Business2" },
{ id: 10, name: "Canton1", parent: 9 },
{ id: 11, name: "Branch1", parent: 10 },
{ id: 12, name: "Branch2", parent: 10 },
{ id: 13, name: "Canton2", parent: 9 },
{ id: 14, name: "Branch1", parent: 13 },
{ id: 15, name: "Branch2", parent: 13 },
{ id: 16, name: "Canton3", parent: 9 },
{ id: 17, name: "Branch1", parent: 16 },
{ id: 18, name: "Branch2", parent: 16 }]


const getParent = (id) => {
    const node = items.filter(e => e.id == id)
    if (node.length == 0) return undefined // throw some error here
    let currentNode = node[0]
    return currentNode.parent !== undefined ? getParent(currentNode.parent) : currentNode
}

console.log(getParent(3))

let _items = [
    {id: 1, name: "Business1"},
    {id: 2, name: "Canton1", parent: 1},
    {id: 3, name: "Branch1", parent: 2},
    {id: 4, name: "Branch2", parent: 2},
    {id: 5, name: "Canton2", parent: 1},
    {id: 6, name: "Branch1", parent: 5},
    {id: 7, name: "Branch2", parent: 5},
    {id: 8, name: "Canton3", parent: 1},
    {id: 9, name: "Branch1", parent: 8},
    {id: 10, name: "Branch2", parent: 8},
    {id: 11, name: "Business2"},
    {id: 12, name: "Canton1", parent: 11},
    {id: 13, name: "Branch1", parent: 12},
    {id: 14, name: "Branch2", parent: 12},
    {id: 15, name: "Canton2", parent: 11},
    {id: 16, name: "Branch1", parent: 15},
    {id: 17, name: "Branch2", parent: 15},
    {id: 18, name: "Canton3", parent: 11},
    {id: 19, name: "Branch1", parent: 18},
    {id: 20, name: "Branch2", parent: 18}
];
function findElementById(id) {
    let element_return = false;
    _items.forEach(element => {
        if (id === element.id) {
            element_return = element;
            return true;
        }
    });
    return element_return;
}
function getRoot(parent) {
    element = findElementById(parent);
    if (element) {
        if (typeof (element.parent) !== "undefined") {
            return getRoot(element.parent);
        } else {
            return element.id;
        }
    } else {
        return parent;
    }
}
let test_root = getRoot(3);
console.log(test_root);
console.log(findElementById(test_root));

test_root = getRoot(11);
console.log(test_root);
console.log(findElementById(test_root));

Related