index.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368
  1. /* Рекурсия: HTML tree
  2. Используя решение этого задания сделайте функцию, которая рекурсивно создает HTML-строку из древовидной структуры данных Javascript любой вложенности. Проверьте результат работы функции выводя HTML-строку используя document.write или же какой-то_элемент.innerHTML*/
  3. {
  4. const table = {
  5. tagName: 'table',
  6. attrs: {
  7. border: "1",
  8. },
  9. children: [
  10. {
  11. tagName: 'tr',
  12. children: [
  13. {
  14. tagName: "td",
  15. children: ["1x1"],
  16. },
  17. {
  18. tagName: "td",
  19. children: ["1x2"],
  20. },
  21. ]
  22. },
  23. {
  24. tagName: 'tr',
  25. children: [
  26. {
  27. tagName: "td",
  28. children: ["2x1"],
  29. },
  30. {
  31. tagName: "td",
  32. children: ["2x2"],
  33. },
  34. ]
  35. }
  36. ]
  37. }
  38. //htmlTree(table) //вернет <table border='1' ....
  39. function recursion (obj) {
  40. let result=""
  41. console.log(obj.tagName)
  42. result += "<" + obj.tagName
  43. if (obj.attrs){
  44. for (property in obj.attrs) {
  45. result += ' ' + property + '="' + obj.attrs[property] + '"'
  46. }
  47. }
  48. result += ">"
  49. console.log(obj.children)
  50. let children
  51. if (obj.children){
  52. children = obj.children
  53. for (const obj of children){
  54. console.log(obj)
  55. if (typeof obj !== 'object') {
  56. result += obj
  57. }
  58. if(typeof obj === 'object') {
  59. result += recursion (obj)
  60. }
  61. }
  62. }
  63. result += "</" + obj.tagName + ">"
  64. return result
  65. }
  66. recursion(table)
  67. const body = {
  68. tagName : 'body',
  69. children : [
  70. {
  71. tagName : 'div',
  72. children : [
  73. {
  74. tagName : 'span',
  75. children : ['Enter a data please:']
  76. },
  77. {
  78. tagName : 'br'
  79. },
  80. {
  81. tagName : 'input',
  82. attrs : {
  83. type : 'text',
  84. id : 'name'
  85. }
  86. },
  87. {
  88. tagName : 'input',
  89. attrs : {
  90. type : 'text',
  91. id : 'surname',
  92. }
  93. }
  94. ]
  95. },
  96. {
  97. tagName : 'div',
  98. children : [
  99. {
  100. tagName : 'button',
  101. attrs : {
  102. id : 'ok'
  103. },
  104. children : ['OK']
  105. },
  106. {
  107. tagName : 'button',
  108. attrs : {
  109. id : 'cancel'
  110. },
  111. children : ['Cancel']
  112. },
  113. ]
  114. }
  115. ]
  116. }
  117. recursion(body)
  118. }
  119. /* Рекурсия: DOM tree
  120. Используя решение этого задания сделайте функцию, которая рекурсивно создает DOM из древовидной структуры данных Javascript. Задание в целом аналогично предыдущему, однако вместо накопления результата в HTML-строке функция должна добавлять элементы созданные через document.createElement в переданного в функцию родителя.
  121. const table = {
  122. ........
  123. }
  124. domTree(document.body, table)*/
  125. {
  126. function recursion (parent, obj) {
  127. const elem = document.createElement(obj.tagName)
  128. parent.append(elem)
  129. if (obj.attrs){
  130. for (property in obj.attrs) {
  131. elem[property] = obj.attrs[property]
  132. }
  133. }
  134. let children
  135. if (obj.children){
  136. children = obj.children
  137. for (const obj of children){
  138. if (typeof obj !== 'object') {
  139. //result += obj
  140. elem.innerText = obj
  141. }
  142. if(typeof obj === 'object') {
  143. recursion (elem, obj)
  144. }
  145. }
  146. }
  147. }
  148. const section = {
  149. tagName : 'section',
  150. children : [
  151. {
  152. tagName : 'div',
  153. children : [
  154. {
  155. tagName : 'span',
  156. children : ['Enter a data please:']
  157. },
  158. {
  159. tagName : 'br'
  160. },
  161. {
  162. tagName : 'input',
  163. attrs : {
  164. type : 'text',
  165. id : 'name'
  166. }
  167. },
  168. {
  169. tagName : 'input',
  170. attrs : {
  171. type : 'text',
  172. id : 'surname',
  173. }
  174. }
  175. ]
  176. },
  177. {
  178. tagName : 'div',
  179. children : [
  180. {
  181. tagName : 'button',
  182. attrs : {
  183. id : 'ok'
  184. },
  185. children : ['OK']
  186. },
  187. {
  188. tagName : 'button',
  189. attrs : {
  190. id : 'cancel'
  191. },
  192. children : ['Cancel']
  193. },
  194. ]
  195. }
  196. ]
  197. }
  198. recursion(document.body, section)
  199. }
  200. /*Рекурсия: Deep Copy
  201. Напишите функцию, которая рекурсивно осуществляет глубокое копирование структур Javascript, в которых нет циклических связей.
  202. const arr = [1,"string", null, undefined, {a: 15, b: 10, c: [1,2,3,4],d: undefined, e: true }, true, false]
  203. const arr2 = deepCopy(arr) //arr2 и все его вложенные массивы и объекты - другие объекты, которые можно менять без риска поменять что-то в arr
  204. const table2 = deepCopy(table) //аналогично*/
  205. {
  206. const arr = [1, "string", null, undefined, { a: 15, b: 10, c: [1, 2, 3, 4], d: undefined, e: true }, true, false]
  207. const arr2 = deepCopy(arr)
  208. function deepCopy(element) {
  209. let result
  210. if (typeof element !== "object" || element === null) return result = element
  211. if (Array.isArray(element)) {
  212. result = []
  213. for (arrElem of element) {
  214. result.push(deepCopy(arrElem))
  215. }
  216. return result
  217. }
  218. if (typeof element === 'object') {
  219. result = {}
  220. for (key in element) {
  221. result[key] = deepCopy(element[key])
  222. }
  223. return result
  224. }
  225. }
  226. }
  227. /*Рекурсия: My Stringify
  228. Напишите аналог JSON.stringify*/
  229. /*
  230. const jsonString = stringify(arr или table из предыдущих заданий) //напишите функцию stringify без использования JSON.stringify
  231. console.log(JSON.parse(jsonString)) //не должно поломаться и должно вернуть структуру, во всем схожую с оригинальным arr или table
  232. */
  233. {
  234. const table = {
  235. tagName: 'table',
  236. attrs: {
  237. border: "1",
  238. },
  239. children: [
  240. {
  241. tagName: 'tr',
  242. children: [
  243. {
  244. tagName: "td",
  245. children: ["1x1"],
  246. },
  247. {
  248. tagName: "td",
  249. children: ["1x2"],
  250. },
  251. ]
  252. },
  253. {
  254. tagName: 'tr',
  255. children: [
  256. {
  257. tagName: "td",
  258. children: ["2x1"],
  259. },
  260. {
  261. tagName: "td",
  262. children: ["2x2"],
  263. },
  264. ]
  265. }
  266. ]
  267. }
  268. function stringify(obj) {
  269. let result = ``
  270. if (typeof obj === 'number' ||
  271. typeof obj === 'boolean' ||
  272. obj === null) return result += obj
  273. if (typeof obj === 'string') return result += `"${obj}"`
  274. if (Array.isArray(obj)) {
  275. result += `[`
  276. if (obj.length > 0) {
  277. for (arrItem of obj) {
  278. result += `${stringify(arrItem)},`
  279. }
  280. result = result.slice(0, result.length - 1)
  281. }
  282. result += `]`
  283. return result
  284. }
  285. if (typeof obj === 'object') {
  286. result += `{`
  287. if (Object.keys(obj).length > 0) {
  288. for (key in obj) {
  289. result += `"${key}":`
  290. result += `${stringify(obj[key])},`
  291. }
  292. result = result.slice(0, result.length - 1)
  293. }
  294. result += `}`
  295. }
  296. return result
  297. }
  298. let a = stringify(table)
  299. console.log(a)
  300. let b = JSON.parse(a)
  301. console.log(b)
  302. }
  303. /*Рекурсия: getElementById throw
  304. Напишите функцию getElementById, которая будет аналогична document.getElementById. В качестве основы можете взять материал лекции (walker), однако в цикл перебора children вставьте проверку на нахождение переданного id. При нахождении элемента по id в рекурсивной функции выбрасывайте исключение со значением найденного DOM-элемента, которое будет поймано на уровне вашей функции getElementById, после чего она вернет выброшенный DOM-элемент. */
  305. {
  306. function getElementById(idToFind) {
  307. function walker(parent = document.body) {
  308. for (const child of parent.children) {
  309. if (child.id === idToFind) throw child
  310. walker(child)
  311. }
  312. }
  313. try {
  314. walker(parent = document.body)
  315. return undefined
  316. } catch (element) { return element }
  317. }
  318. //ищем id = 'h1-1' на http://doc.a-level.com.ua/five-recursion-try-catch-finally
  319. let element = getElementById('h4-7_19')
  320. console.log(element)
  321. }