JavaScript - находить и изменять данные из одного древовидного списка в зависимости от условий - PullRequest
1 голос
/ 02 августа 2020

У меня есть список объектов (дерево с отношениями родитель-потомок, которое go до более глубокого уровня):

const treeItems = [
  {
    id: 'parent1',
    label: 'Welcome',
    value:'noted',
    parent: 'root',
    expanded: true,
    enabled: false,
    state: 'SUCCESS',
    children: [
      {
        id: 'child1',
        label: 'To',
        value:'noted1',
        parent: 'child1',
        expanded: true,
        enabled: false,
        state: 'SUCESS',
        children: [
          {
            id: 'child1.1',
            label: 'JavaScript',
            value:'noted2',
            parent: 'child1.1',
            expanded: true,
            enabled: false,
            state: 'SUCCESS',
            children: [],
          },
        ],
      },
    ],
  },
  {
    id: 'parent2',
    label: 'Welcome',
    value:
      '',
    parent: 'root',
    expanded: true,
    enabled: false,
    state: 'FAILED',
    children: [
      {
        id: 'child2',
        label: 'JavaScript',
        value: '',
        parent: 'parent2',
        enabled: false,
        state: 'SUCCESS',
        expanded: true,
        children: [],
      },
    ],
  },
];

И у меня есть список ошибок, как показано ниже: -

const errorsList = [{id:'child1',success:false},{id:'parent2',success:false},{id:'child1.1',success:false}];

Моя цель - проверить errorsList, и если есть какой-либо идентификатор, который соответствует treeItems, мне нужно изменить свойство state этого treeItem на 'FAILED'.

Например : В приведенном выше случае id: child1 находится в errorsList, поэтому мне пришлось бы найти id child1 в treeItems и изменить его состояние с SUCCESS на FAILED. И это должно быть go для всех ошибок, которые доступны в списке ошибок.

Я написал для него лог c ниже, но этот метод требует больше времени для выполнения (от 3 до 4 секунды в зависимости от глубины treeItems. Ищу более тонкое решение.

  function setFailedItemsToStatusFailed(treeItems, errorsList) {
    treeItems.forEach(item=> {
      errorsList.forEach(error => {
        if (item) {
          if (item.id === error.id) {
            item.state = 'FAILED';
            return;
          } else if (item.children && item.children.length) {
            setFailedItemsToStatusFailed(item.children, errorsList);
          }
        }
      });
    });
  }
...