Создать мат-дерево для Angular и некоторые проблемы

#angular #tree #element

#angular #дерево #элемент

Вопрос:

Мне нужна ваша помощь или совет о том, как создать элемент дерева для проекта с данными из базы данных. У меня есть такая же таблица для преобразования в дерево.

Данные с сервера

На картинке поля CounterpartyGroupParentId, где вводится 0, указывают, и это корень дерева. Затем из следующего поля методом filter я беру CounterpartyGroupName и CounterpartyGroupId, как видно, это 10,11. Когда у нас есть идентификатор 10,11 по фильтру, я беру следующий CounterpartyGroupParentId, где также существует 10,11. Следующим шагом будет поиск элементов в CounterpartyGroupId, где 13,15 соответственно с item4,item6. Это второй слой дерева. Для третьего уровня я ищу CounterpartyGroupParentId с тем же идентификатором 13 и 15 и получаю item5, item8 для Id 13 и Item3 для 15. Следующая структура должна быть законченным деревом в DOM:

Готовое дерево в DOM.

Я пытался реализовать это в своих проектах.

 rootarray: any[] = [];
treview_array(arr): CounterpartyGroupTree[] {
    var secondroot = [],
      roots = [];
    roots = arr.filter((x) => x.counterpartyGroupParentId == 0);
    roots.forEach((val) => {
      this.rootarray.push({
        name: val["counterpartyGroupName"],
        id: val["counterpartyGroupId"],
        children: [],
      });
    }, this);

    for (let i = 0; i < this.rootarray.length; i  ) {
      secondroot.push(
        arr.filter(
          (x) => x.counterpartyGroupParentId == this.rootarray[i]["id"]
        )
      );
    }
    let filteredarray = [...secondroot[0], ...secondroot[1]];

    filteredarray.forEach((val, index) => {
      this.rootarray[index]["children"].push({
        name: val["counterpartyGroupName"],
        id: val["counterpartyGroupId"],
        children: [],
      });
    }, this);
    var thirdroot = [];

    for (let k = 0; k < this.rootarray.length; k  ) {
      for (let l = 0; l < this.rootarray[k]["children"].length; l  ) {
        if (this.rootarray[l]["children"] != 0) {
          thirdroot.push(
            arr.filter(
              (x) =>
                x.counterpartyGroupParentId ==
                this.rootarray[l]["children"][l]["id"]
            )
          );
        }
      }
    }
    var filteredroot = [...thirdroot[0], ...thirdroot[1]];

    filteredroot.forEach((val, index) => {
      if (
        val["CounterpartyGroupParentId"] ==
        filteredarray["counterpartyGroupId"]
      ) {
        this.rootarray[index]["children"][0]["children"].push({
          name: val["counterpartyGroupName"],
          id: val["counterpartyGroupId"],
          children: [],
        });
      } else {
        this.rootarray[index]["children"][0]["children"].push({
          name: val["counterpartyGroupName"],
          id: val["counterpartyGroupId"],
          children: [],
        });
      }
    });

   console.log(this.rootarray);

    return this.rootarray;
  }
 

И интерфейс

 export interface CounterpartyGroupTree{
 name:string;
 id: number;
 children?:CounterpartyGroupTree[];

}
 

На третьем уровне у меня есть mash и трудности с вставкой выбранных данных в дерево.