изменить дату с плоской на дерево - PullRequest
2 голосов
/ 14 апреля 2020

У меня есть маппер, и я изменяю плоские данные на данные дерева с моим маппером. js, и это работает. у каждого элемента в моих данных есть parentId, и я проверяю parentId по их идентификатору и делаю его в виде данных дерева. и я изменяю свои плоские данные на данные дерева с моим parentId. но у меня есть проблема с этим, и моя проблема в том, что мои данные дерева только для шага буксировки и не глубже 3 шага

вот мои плоские данные

 let data = [
      {
        "id": "26088812-0d3f-458b-b7e7-8ba79f63c795",
        "name": "garand father",
        "parentId": ""
      },
      {
        "id": "161fcd9f-2345-4b60-8dd6-4c31c90ba53e",
        "name": "father 1",
        "parentId": "26088812-0d3f-458b-b7e7-8ba79f63c795"
      },
      {
        "id": "baab7121-b26b-4fee-925d-274b2153b19f",
        "name": "child 1",
        "parentId": "161fcd9f-2345-4b60-8dd6-4c31c90ba53e"
      },
      {
        "id": "ceb26f26-f96c-49f7-a9f2-0ee61d9ada55",
        "name": "grand child 1",
        "parentId": "baab7121-b26b-4fee-925d-274b2153b19f"
      }
    ]

let newArray = maper(data, data);
newArray = newArray.filter((x) => !x.parentId);
console.log("newArray",newArray)

я использую из мой маппер и измени его на дерево здесь мой маппер

маппер. js

export default function maper(data, filterData) {
  return data.map((x) => {
    let newX = {
      ...x,
      employees: filterData.filter((xfilter) => x.id === xfilter.parentId),
    };
    if (newX.employees.length === 0) {
      return newX;
    } else {
      return { ...newX, employees: maper(newX.employees, data) };
    }
  });
}

его работа, и я делаю с ним данные дерева, но я делаю не получить grandChild 1. Я имею в виду, что он не go глубже, чем шаг буксировки.

вот мой журнал из newArray

[
  {
    "id": "26088812-0d3f-458b-b7e7-8ba79f63c795",
    "name": "garand father",
    "parentId": "",
    "employees": [
      {
        "id": "161fcd9f-2345-4b60-8dd6-4c31c90ba53e",
        "name": "father 1",
        "parentId": "26088812-0d3f-458b-b7e7-8ba79f63c795",
        "employees": [
          {
            "id": "baab7121-b26b-4fee-925d-274b2153b19f",
            "name": "child 1",
            "parentId": "161fcd9f-2345-4b60-8dd6-4c31c90ba53e",
            "employees": []
          }
        ]
      }
    ]
  }
]

1 Ответ

4 голосов
/ 14 апреля 2020

Проблема в том, что когда вы обрабатываете узел на data.map, некоторые его дочерние элементы могут еще не быть обработаны. Вместо этого используйте код из этого ответа :

let data = [{
    "id": "26088812-0d3f-458b-b7e7-8ba79f63c795",
    "name": "grand father",
    "parentId": ""
  }, {
    "id": "161fcd9f-2345-4b60-8dd6-4c31c90ba53e",
    "name": "father 1",
    "parentId": "26088812-0d3f-458b-b7e7-8ba79f63c795"
  }, {
    "id": "baab7121-b26b-4fee-925d-274b2153b19f",
    "name": "child 1",
    "parentId": "161fcd9f-2345-4b60-8dd6-4c31c90ba53e"
  }, {
    "id": "ceb26f26-f96c-49f7-a9f2-0ee61d9ada55",
    "name": "grand child 1",
    "parentId": "baab7121-b26b-4fee-925d-274b2153b19f"
  }];

function list_to_tree(list) {
  var map = {}, node, roots = [], i;
  for (i = 0; i < list.length; i += 1) {
    map[list[i].id] = i; // initialize the map
    list[i].employees = []; // initialize the children
  }
  for (i = 0; i < list.length; i += 1) {
    node = list[i];
    if (node.parentId !== "") {
      // if you have dangling branches check that map[node.parentId] exists
      list[map[node.parentId]].employees.push(node);
    } else {
      roots.push(node);
    }
  }
  return roots;
}

console.log(list_to_tree(data));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...