Рекурсивный цикл по вложенному массиву объектов для записи вложенного списка - PullRequest
0 голосов
/ 04 марта 2019

Имея вложенный массив объектов, я пытаюсь записать во вложенный неупорядоченный список.

Сами массивы организованы так, что каждое новое дочернее свойство запускает новый массив объектов.Функция должна поддерживать глубину уровня n.

Мое текущее решение может рекурсивно записать все нужные мне свойства, но добавляет теги

к неверному
  • тоже.Он выбирает только первый найденный тег

1 Ответ

0 голосов
/ 04 марта 2019

Когда вы рекурсивно вызываете функцию listOrg, вы должны отправить переменную newUL в качестве параметра вместо lowUL.listOrg(orgData[i].children,newUL) это будет предназначаться для недавно созданного ul, вам не нужно использовать querySelector

// DATA
const org1_depts = [
  {
    name: 'accounting',
    children: [
      { name: 'accounting payable', children: [] },
      { name: 'accounting receivable', children: [] },
    ],
  },
  {
    name: 'finance',
    children: [],
  },
]

const org2_depts = [
  {
    name: 'accounting',
    children: [
      { name: 'accounting payable', children: [] },
      {
        name: 'accounting receivable',
        children: [{ name: 'cash', children: [] }, { name: 'check', children: [] }],
      },
    ],
  },
  {
    name: 'finance',
    children: [{ name: 'investment', children: [] }],
  },
]

// FUNCTION

function listOrg(orgData,targetUL) {
  var i;
  for (i = 0; i < orgData.length; i++) {
    if (orgData[i].hasOwnProperty('name')) {
      // Take out the text from the .name property
      var nameText = document.createTextNode(orgData[i].name);
      // Define a new <li> tag
      var newLI = document.createElement('li');
      // Append text to new <li> tage - newLI
      newLI.appendChild(nameText);
      // Append element to <ul> tag
      targetUL.appendChild(newLI);
    }

    if (orgData[i].hasOwnProperty('children')) {
      // Define new <ul> tag
      var newUL = document.createElement('ul');
      // Append new <ul> tag
      var lowUl = targetUL.appendChild(newUL);
      // Select new lower level <ul> tag
      var lowUL = targetUL.querySelector('ul');
      // Recurse
      listOrg(orgData[i].children,newUL );
    }
  }
}

// CALL FUNCTION
listOrg(org1_depts,document.getElementById("org1"));
listOrg(org2_depts,document.getElementById("org2"));
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
</head>
<body>
<ul id='org1'>
  Organization 1
</ul>

<ul id='org2'>
  Organization 2
</ul>

</body>
</html>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...