Удалить родительский элемент во вложенной иерархии (дереве) объектов с сохранением дочерних элементов - PullRequest
1 голос
/ 14 июля 2020

Я пытаюсь удалить объект во вложенном (иерархическом) массиве объектов с отношениями родитель-потомок. Я хочу удалить из этого объект, у которого атрибут «required» как false, а «name» пуст или равен нулю. Когда я удаляю этот объект, если это родительский объект, я хочу, чтобы дочерние элементы были прикреплены к дедушке и бабушке (родительскому родительскому объекту). Но когда я удаляю его в рекурсии, удаляется весь элемент, включая дочерний. Пожалуйста, помогите с рекурсивным подходом.

Ниже представлена ​​структура

{
  "name": "abc",
  "nodeId": 1,
  "parentNodeId": null,
  "required": true,
  "children": [
    {
      "name": "",
      "nodeId": 2,
      "parentNodeId": 1,
      "required": false,
      "children": [
        {
          "name": "",
          "nodeId": 3,
          "parentNodeId": 2,
          "required": false,
          "children": [
            {
              "name": "xyz",
              "nodeId": 4,
              "parentNodeId": 3,
              "required": true,
              "children": []
            }
          ]
        },
        {
          "name": "pqr",
          "nodeId": 5,
          "parentNodeId": 2,
          "required": true,
          "children": []
        }
      ]
    }
  ]
}

В приведенном выше сценарии дочерний элемент с именем 'xyz' должен быть напрямую привязан к nodeId, равному 1 (ab c), поскольку его непосредственные родители должны быть удалены.

Я нашел это конкретное решение для удаления на основе заданного условия, но оно не сохраняет дочерние элементы.

removeFromTree(root, parent, idx) {
    if (!root.name && root.required === false) {
      if (parent) {
        parent.modelLines.splice(idx, 1);
      }
      else return null;
    }

    if (root.modelLines != null) {
      for (const [i, e] of root.children.entries()) {
        this.removeFromTree(e, root, i);
      }
    }

   return tree;
  };

Пожалуйста, помогите разобраться с этим сценарием

1 Ответ

0 голосов
/ 15 июля 2020

Вы можете использовать приведенный ниже фрагмент кода для удовлетворения ваших требований:

removeFromTree = function(node) {
  var childrenHolder = []
  var accumulator = []

  for(const [i, child] of node.children.entries()) {
    var holder = removeFromTree(child);
    if (child.name || child.required === true) {
      childrenHolder.push(child)
    }
    else {
      accumulator = [...accumulator, ...holder]
    }
  }
  node.children = [...childrenHolder,...accumulator]
  for( var [i, child] of node.children.entries()) {
    child.parentNodeId = node.nodeId
  }
  return node.children
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...