index.js 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. // ДЗ: Рекурсия и Исключения
  2. // задание 1 Рекурсия: HTML tree
  3. {
  4. function htmlTree(node) {
  5. // Создаем строку с тегом
  6. let result = `<${node.tagName}`;
  7. // Добавляем атрибуты тега
  8. if (node.attrs) {
  9. for (let [key, value] of Object.entries(node.attrs)) {
  10. result += ` ${key}='${value}'`;
  11. }
  12. }
  13. // Добавляем дочерние элементы тега
  14. result += '>';
  15. if (node.children) {
  16. for (let child of node.children) {
  17. result += htmlTree(child);
  18. }
  19. }
  20. // Закрываем тег
  21. result += `</${node.tagName}>`;
  22. return result;
  23. }
  24. }
  25. {
  26. // Чтобы вывести сгенерированную HTML-строку на страницу, можно использовать функцию document.write:
  27. document.write(htmlTree(table));
  28. }
  29. // задание 2 Рекурсия: DOM tree
  30. {
  31. function domTree(parent, node) {
  32. // Создаем элемент
  33. let element = document.createElement(node.tagName);
  34. // Добавляем атрибуты элемента
  35. if (node.attrs) {
  36. for (let [key, value] of Object.entries(node.attrs)) {
  37. element.setAttribute(key, value);
  38. }
  39. }
  40. // Добавляем дочерние элементы
  41. if (node.children) {
  42. for (let child of node.children) {
  43. domTree(element, child);
  44. }
  45. }
  46. // Добавляем элемент в родителя
  47. parent.appendChild(element);
  48. }
  49. }
  50. {
  51. // Чтобы вызвать функцию, нужно указать родительский элемент DOM и объект с описанием структуры HTML:
  52. domTree(document.body, table);
  53. }
  54. // задание 3 Рекурсия: Deep Copy
  55. {
  56. function deepCopy(obj) {
  57. if (obj == null || typeof obj !== 'object') {
  58. return obj;
  59. }
  60. // Обрабатываем массивы
  61. if (Array.isArray(obj)) {
  62. let copy = [];
  63. for (let item of obj) {
  64. copy.push(deepCopy(item));
  65. }
  66. return copy;
  67. }
  68. // Обрабатываем объекты
  69. let copy = {};
  70. for (let key of Object.keys(obj)) {
  71. copy[key] = deepCopy(obj[key]);
  72. }
  73. return copy;
  74. }
  75. }
  76. {
  77. // Чтобы скопировать массив или объект, нужно вызвать функцию с соответствующим аргументом:
  78. let arr2 = deepCopy(arr);
  79. let table2 = deepCopy(table);
  80. }
  81. // задание 4 Рекурсия: My Stringify
  82. {
  83. function stringify(obj) {
  84. if (obj == null) {
  85. return 'null';
  86. }
  87. if (typeof obj === 'string') {
  88. return `"${obj}"`;
  89. }
  90. if (typeof obj === 'number' || typeof obj === 'boolean') {
  91. return obj.toString();
  92. }
  93. // Обрабатываем массивы
  94. if (Array.isArray(obj)) {
  95. let items = obj.map(stringify);
  96. return `[${items.join(',')}]`;
  97. }
  98. // Обрабатываем объекты
  99. let properties = Object.keys(obj).map((key) => `"${key}":${stringify(obj[key])}`);
  100. return `{${properties.join(',')}}`;
  101. }
  102. }
  103. {
  104. // Чтобы преобразовать объект в JSON-строку, нужно вызвать функцию с соответствующим аргументом:
  105. let jsonString = stringify(arr);
  106. }
  107. // задание 5 Рекурсия: getElementById throw
  108. {
  109. function getElementById(idToFind) {
  110. function walker(parent) {
  111. if (!parent || !parent.children) {
  112. return;
  113. }
  114. for (let child of parent.children) {
  115. if (child.id === idToFind) {
  116. throw child;
  117. }
  118. walker(child);
  119. }
  120. }
  121. try {
  122. walker(document);
  123. } catch (element) {
  124. return element;
  125. }
  126. }
  127. }
  128. {
  129. // Чтобы получить элемент с определенным id, нужно вызвать функцию с соответствующим аргументом:
  130. let element = getElementById('my-element');
  131. }