Рекурсия.js 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  1. // Рекурсия: HTML tree
  2. {
  3. function htmlTree(parent){
  4. let strHtml
  5. if (parent.tagName) {
  6. strHtml = `<${parent.tagName}`
  7. if (parent.attrs) {
  8. for (const attr in parent.attrs) {
  9. strHtml += ` ${attr} = ${parent.attrs[attr]}`
  10. }
  11. }
  12. strHtml += '>'
  13. for (const child of parent.children) {
  14. strHtml += htmlTree(child)
  15. }
  16. strHtml += `</${parent.tagName}>`
  17. }
  18. else {
  19. strHtml = parent
  20. }
  21. return strHtml
  22. }
  23. let container = document.createElement('container')
  24. container.innerHTML= htmlTree(table)
  25. document.body.append(container)
  26. }
  27. //Рекурсия: DOM tree
  28. {
  29. function domTree(parentHtmlTree,jsTree){
  30. if (jsTree.tagName) {
  31. let tag = document.createElement(jsTree.tagName)
  32. if (jsTree.attrs) {
  33. for (const attr in jsTree.attrs) {
  34. tag[attr] = jsTree.attrs[attr]
  35. }
  36. }
  37. parentHtmlTree.append(tag)
  38. for (const child of jsTree.children) {
  39. domTree(tag,child)
  40. }
  41. }
  42. else {
  43. parentHtmlTree.append(jsTree)
  44. }
  45. }
  46. const table = {
  47. tagName: 'table',
  48. attrs: {
  49. border: "1",
  50. },
  51. children: [
  52. {
  53. tagName: 'tr',
  54. children: [
  55. {
  56. tagName: "td",
  57. children: ["1x1"],
  58. },
  59. {
  60. tagName: "td",
  61. children: ["1x2"],
  62. },
  63. ]
  64. },
  65. {
  66. tagName: 'tr',
  67. children: [
  68. {
  69. tagName: "td",
  70. children: ["2x1"],
  71. },
  72. {
  73. tagName: "td",
  74. children: ["2x2"],
  75. },
  76. ]
  77. }
  78. ]
  79. }
  80. domTree(document.body, table)
  81. }
  82. //Рекурсия : Глубокое копирование
  83. {
  84. function deepCopy(parent){
  85. let data
  86. if(Array.isArray(parent)){
  87. data=[]
  88. }
  89. else if(typeof parent === "object" && !Array.isArray(parent) && parent != null){
  90. data={}
  91. }
  92. else{
  93. return data=parent
  94. }
  95. for(let el in parent){
  96. data[el] = deepCopy(parent[el])
  97. }
  98. return data
  99. }
  100. const table = {
  101. tagName: 'table',
  102. attrs: {
  103. border: "1",
  104. },
  105. children: [
  106. {
  107. tagName: 'tr',
  108. children: [
  109. {
  110. tagName: "td",
  111. children: ["1x1"],
  112. },
  113. {
  114. tagName: "td",
  115. children: ["1x2"],
  116. },
  117. ]
  118. },
  119. {
  120. tagName: 'tr',
  121. children: [
  122. {
  123. tagName: "td",
  124. children: ["2x1"],
  125. },
  126. {
  127. tagName: "td",
  128. children: ["2x2"],
  129. },
  130. ]
  131. }
  132. ]
  133. }
  134. const arr = [1,"string", null, undefined, {a: 15, b: 10, c: [1,2,3,4],d: undefined, e: true }, true, false]
  135. const arr2 = deepCopy(arr) //arr2 и все его вложенные массивы и объекты - другие объекты, которые можно менять без риска поменять что-то в arr
  136. const table2 = deepCopy(table) //аналогично
  137. }
  138. //Рекурсия : My Stringify
  139. {
  140. function stringify(parent){
  141. let text=''
  142. function stringifyNested(parent){
  143. let data
  144. let type
  145. if(Array.isArray(parent)){
  146. data=[]
  147. text+='['
  148. }
  149. else if(typeof parent === "object" && !Array.isArray(parent) && parent != null){
  150. data={}
  151. text+='{'
  152. type="object"
  153. }
  154. else{
  155. return data=parent
  156. }
  157. let i = 0
  158. for(let el in parent){
  159. if(type==="object"){
  160. text+= '"'+el+'":'
  161. }
  162. data[el] = stringifyNested(parent[el])
  163. i++
  164. if(typeof data[el] === 'number'|| data[el]===null || typeof data[el] === 'boolean'){
  165. text+=data[el]+','
  166. }
  167. else if(typeof data[el] === 'string'){
  168. text+='"'+data[el]+'",'
  169. }
  170. else if(typeof data[el] === 'undefined'){
  171. text+= null+','
  172. }
  173. if(parent.length===i || Object.keys(parent).length===i){
  174. text=text.slice(0,-1)
  175. type==="object"? text+= '},':text+= '],'
  176. }
  177. }
  178. return data
  179. }
  180. stringifyNested(parent)
  181. return text.slice(0,-1)
  182. }
  183. const arr = [1,"string", null, undefined, {a: 15, b: 10, c: [1,2,3,4],d: undefined, e: true }, true, false]
  184. const jsonString = stringify(arr) //напишите функцию stringify без использования JSON.stringify
  185. console.log(JSON.parse(jsonString)) //не должно поломаться и должно вернуть структуру, во всем схожую с оригинальным arr или table
  186. }