HW15.js 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293
  1. // Рекурсия: HTML tree
  2. // Используя решение этого задания сделайте функцию, которая рекурсивно создает HTML - строку из древовидной структуры данных Javascript любой вложенности.Проверьте результат работы функции выводя HTML - строку используя document.write или же какой - то_элемент.innerHTML
  3. {
  4. function htmlTree(data) {
  5. let copy
  6. copy = `<${data.tagName}`
  7. if (data.attrs) {
  8. for (const [attrName, attrParam] of Object.entries(data.attrs)) {
  9. copy += ` ${attrName}='${attrParam}'`
  10. }
  11. }
  12. copy += `>`
  13. if (data.children) {
  14. for (const child of data.children) {
  15. typeof child === 'object' ? copy += htmlTree(child) : copy += `${child}`
  16. }
  17. }
  18. copy += `</${data.tagName}>`
  19. return copy
  20. }
  21. // Проверка
  22. const table = {
  23. tagName: 'table',
  24. attrs: {
  25. border: "1",
  26. },
  27. children: [
  28. {
  29. tagName: 'tr',
  30. children: [
  31. {
  32. tagName: "td",
  33. children: ["1x1"],
  34. },
  35. {
  36. tagName: "td",
  37. children: ["1x2"],
  38. },
  39. ]
  40. },
  41. {
  42. tagName: 'tr',
  43. children: [
  44. {
  45. tagName: "td",
  46. children: ["2x1"],
  47. },
  48. {
  49. tagName: "td",
  50. children: ["2x2"],
  51. },
  52. ]
  53. }
  54. ]
  55. }
  56. htmlTree(table)
  57. document.write(htmlTree(table))
  58. }
  59. // Рекурсия: DOM tree
  60. // Используя решение этого задания сделайте функцию, которая рекурсивно создает DOM из древовидной структуры данных Javascript.Задание в целом аналогично предыдущему, однако вместо накопления результата в HTML - строке функция должна добавлять элементы созданные через document.createElement в переданного в функцию родителя.
  61. {
  62. function domTree(parent, data) {
  63. const tag = document.createElement(data.tagName)
  64. if (data.attrs) {
  65. for (const [attrName, attrParam] of Object.entries(data.attrs)) {
  66. tag[attrName] = attrParam
  67. }
  68. }
  69. parent.append(tag)
  70. if (data.children) {
  71. for (const child of data.children) {
  72. typeof child === 'object' ? domTree(tag, child) : tag.innerHTML = child
  73. }
  74. }
  75. }
  76. // Проверка
  77. const table = {
  78. tagName: 'table',
  79. attrs: {
  80. border: "1",
  81. },
  82. children: [
  83. {
  84. tagName: 'tr',
  85. children: [
  86. {
  87. tagName: "td",
  88. children: ["1x1"],
  89. },
  90. {
  91. tagName: "td",
  92. children: ["1x2"],
  93. },
  94. ]
  95. },
  96. {
  97. tagName: 'tr',
  98. children: [
  99. {
  100. tagName: "td",
  101. children: ["2x1"],
  102. },
  103. {
  104. tagName: "td",
  105. children: ["2x2"],
  106. },
  107. ]
  108. }
  109. ]
  110. }
  111. domTree(document.body, table)
  112. }
  113. // Рекурсия: Deep Copy
  114. // Напишите функцию, которая рекурсивно осуществляет глубокое копирование структур Javascript, в которых нет циклических связей.
  115. {
  116. function deepCopy(data) {
  117. let copy
  118. if (Array.isArray(data)) {
  119. copy = []
  120. } else if (typeof data === 'object' && data !== null) {
  121. copy = {}
  122. } else return data
  123. for (const item in data) {
  124. copy[item] = deepCopy(data[item])
  125. }
  126. return copy
  127. }
  128. // Проверка
  129. const arr = [1, "string", null, undefined, { a: 15, b: 10, c: [1, 2, 3, 4], d: undefined, e: true }, true, false]
  130. const arr2 = deepCopy(arr) //arr2 и все его вложенные массивы и объекты - другие объекты, которые можно менять без риска поменять что-то в arr
  131. const table = {
  132. tagName: 'table',
  133. attrs: {
  134. border: "1",
  135. },
  136. children: [
  137. {
  138. tagName: 'tr',
  139. children: [
  140. {
  141. tagName: "td",
  142. children: ["1x1"],
  143. },
  144. {
  145. tagName: "td",
  146. children: ["1x2"],
  147. },
  148. ]
  149. },
  150. {
  151. tagName: 'tr',
  152. children: [
  153. {
  154. tagName: "td",
  155. children: ["2x1"],
  156. },
  157. {
  158. tagName: "td",
  159. children: ["2x2"],
  160. },
  161. ]
  162. }
  163. ]
  164. }
  165. const table2 = deepCopy(table) //аналогично
  166. }
  167. // Рекурсия: My Stringify
  168. // Напишите аналог JSON.stringify
  169. {
  170. function stringify(data) {
  171. let copy = ''
  172. if (Array.isArray(data)) {
  173. copy += `[`
  174. } else if (typeof data === 'object' && data !== null) {
  175. copy += `{`
  176. } else return data
  177. for (const item in data) {
  178. if (data[item] == undefined) {
  179. copy += `${null}`
  180. } else if (typeof data[item] === 'number' || typeof data[item] === 'boolean') {
  181. copy += `${data[item]}`
  182. } else if (typeof data[item] === 'string') {
  183. copy += `"${data[item]}"`
  184. } else if (typeof data[item] === 'object' && data[item] !== null) {
  185. if (typeof data === 'object' && data !== null) {
  186. copy += `{`
  187. let i = 1
  188. for (const [key, value] of Object.entries(data[item])) {
  189. if (value == undefined) {
  190. data[item][key] = null
  191. } else if (typeof value !== 'object') {
  192. copy += `"${key}":` + (typeof value === 'string' ? `"${value}"` : value)
  193. if (i < Object.keys(data[item]).length) copy += ','
  194. } else {
  195. copy += `"${key}":${stringify(value)}`
  196. copy += ','
  197. }
  198. i++
  199. }
  200. }
  201. copy += `}`
  202. } else {
  203. copy += `${stringify(data[item])}`
  204. }
  205. if (item < (data.length - 1)) copy += ','
  206. }
  207. copy += `${Array.isArray(data) ? ']' : '}'} `
  208. return copy
  209. }
  210. const number = [1, 2, 3, false, "string", { a: 10, b: 'stepan' }]
  211. let test = stringify(number)
  212. console.log('sourse: ', JSON.stringify(number))
  213. console.log('sourse reverse: ', JSON.parse(JSON.stringify(number)))
  214. console.log('===============================================================================================')
  215. console.log('result: ', test)
  216. console.log('result reverse: ', JSON.parse(test))
  217. const arr = [1, "string", null, undefined, { a: 15, b: 10, c: [1, 2, 3, 4], d: undefined, e: true }, true, false]
  218. let jsonString = stringify(arr)
  219. console.log('sourse: ', JSON.stringify(arr))
  220. console.log('sourse reverse: ', JSON.parse(JSON.stringify(arr)))
  221. console.log('===============================================================================================')
  222. console.log('result: ', jsonString)
  223. console.log('result reverse: ', JSON.parse(jsonString))
  224. // пока не работает
  225. let tableParse = stringify(table)
  226. console.log('sourse: ', JSON.stringify(table))
  227. console.log('sourse reverse: ', JSON.parse(JSON.stringify(table)))
  228. console.log('===============================================================================================')
  229. console.log('result: ', tableParse)
  230. console.log('result reverse: ', JSON.parse(tableParse))
  231. }
  232. // Рекурсия: getElementById throw
  233. // Напишите функцию getElementById, которая будет аналогична document.getElementById.В качестве основы можете взять материал лекции(walker), однако в цикл перебора children вставьте проверку на нахождение переданного id.При нахождении элемента по id в рекурсивной функции выбрасывайте исключение со значением найденного DOM - элемента, которое будет поймано на уровне вашей функции getElementById, после чего она вернет выброшенный DOM - элемент.
  234. {
  235. function getElementById(idToFind) {
  236. function walker(parent = document.body) {
  237. for (const child of parent.children) {
  238. if (child.id == idToFind) {
  239. throw child
  240. }
  241. walker(child)
  242. }
  243. }
  244. try {
  245. walker()
  246. }
  247. catch (e) {
  248. return console.log(e)
  249. }
  250. }
  251. // http://doc.a-level.com.ua/five-recursion-try-catch-finally-homework
  252. getElementById('h1-1_0')
  253. }