123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282 |
- // Рекурсия: HTML tree
- {
- function htmlTree(parent){
- let strHtml
- if (parent.tagName) {
- strHtml = `<${parent.tagName}`
-
- if (parent.attrs) {
- for (const attr in parent.attrs) {
- strHtml += ` ${attr} = ${parent.attrs[attr]}`
- }
- }
- strHtml += '>'
- for (const child of parent.children) {
- strHtml += htmlTree(child)
- }
- strHtml += `</${parent.tagName}>`
- }
- else {
- strHtml = parent
- }
- return strHtml
- }
- let container = document.createElement('container')
- container.innerHTML= htmlTree(table)
- document.body.append(container)
- }
- //Рекурсия: DOM tree
- {
- function domTree(parentHtmlTree,jsTree){
-
- if (jsTree.tagName) {
- let tag = document.createElement(jsTree.tagName)
-
- if (jsTree.attrs) {
- for (const attr in jsTree.attrs) {
- tag[attr] = jsTree.attrs[attr]
- }
- }
- parentHtmlTree.append(tag)
-
- for (const child of jsTree.children) {
- domTree(tag,child)
- }
-
- }
- else {
- parentHtmlTree.append(jsTree)
- }
-
-
- }
- const table = {
- tagName: 'table',
- attrs: {
- border: "1",
- },
- children: [
- {
- tagName: 'tr',
- children: [
- {
- tagName: "td",
- children: ["1x1"],
- },
- {
- tagName: "td",
- children: ["1x2"],
- },
- ]
- },
- {
- tagName: 'tr',
- children: [
- {
- tagName: "td",
- children: ["2x1"],
- },
- {
- tagName: "td",
- children: ["2x2"],
- },
- ]
- }
- ]
- }
- domTree(document.body, table)
- }
- //Рекурсия : Глубокое копирование
- {
- function deepCopy(parent){
- let data
-
- if(Array.isArray(parent)){
- data=[]
- }
- else if(typeof parent === "object" && !Array.isArray(parent) && parent != null){
- data={}
- }
- else{
- return data=parent
- }
-
- for(let el in parent){
- data[el] = deepCopy(parent[el])
- }
- return data
- }
-
- const table = {
- tagName: 'table',
- attrs: {
- border: "1",
- },
- children: [
- {
- tagName: 'tr',
- children: [
- {
- tagName: "td",
- children: ["1x1"],
- },
- {
- tagName: "td",
- children: ["1x2"],
- },
- ]
- },
- {
- tagName: 'tr',
- children: [
- {
- tagName: "td",
- children: ["2x1"],
- },
- {
- tagName: "td",
- children: ["2x2"],
- },
- ]
- }
- ]
- }
- const arr = [1,"string", null, undefined, {a: 15, b: 10, c: [1,2,3,4],d: undefined, e: true }, true, false]
- const arr2 = deepCopy(arr) //arr2 и все его вложенные массивы и объекты - другие объекты, которые можно менять без риска поменять что-то в arr
- const table2 = deepCopy(table) //аналогично
- }
- //Рекурсия : My Stringify
- {
- //let text=''
- function stringify(parent){
- let text=''
- let data
- let type
- if(Array.isArray(parent)){
- data=[]
- text+='['
- }
- else if(typeof parent === "object" && !Array.isArray(parent) && parent != null){
- data={}
- text+='{'
- type="object"
- }
- else{
-
- return data=parent
- }
- let i = 0
- for(let el in parent){
- if(type==="object"){
- text+= '"'+el+'":'
- }
- data[el] = stringify(parent[el])
- i++
-
- if(typeof data[el] === 'number'|| data[el]===null || typeof data[el] === 'boolean'){
- text+=data[el]+','
- }
- else if(typeof data[el] === 'string'){
- text+='"'+data[el]+'",'
- }
- else if(typeof data[el] === 'undefined'){
- text+= null+','
- }
-
- if(parent.length===i || Object.keys(parent).length===i){
- text=text.slice(0,-1)
- type==="object"? text+= '},':text+= '],'
- }
-
- }
-
- return text.split('}"').join('}').split(']"').join(']').split('"{').join('{').split('"[').join('[').slice(0,-1)
- }
- const arr = [1,"string", null, undefined, {a: 15, b: 10, c: [1,2,3,4],d: undefined, e: true }, true, false]
- const jsonString = stringify(arr) //напишите функцию stringify без использования JSON.stringify
- console.log(JSON.parse(jsonString)) //не должно поломаться и должно вернуть структуру, во всем схожую с оригинальным arr или table
- }
- //Рекурсия : My Stringify
- {
- function stringify(parent){
- let text=''
- function stringifyNested(parent){
- let data
- let type
- if(Array.isArray(parent)){
- data=[]
- text+='['
- }
- else if(typeof parent === "object" && !Array.isArray(parent) && parent != null){
- data={}
- text+='{'
- type="object"
- }
- else{
-
- return data=parent
- }
- let i = 0
- for(let el in parent){
- if(type==="object"){
- text+= '"'+el+'":'
- }
- data[el] = stringifyNested(parent[el])
- i++
-
- if(typeof data[el] === 'number'|| data[el]===null || typeof data[el] === 'boolean'){
- text+=data[el]+','
- }
- else if(typeof data[el] === 'string'){
- text+='"'+data[el]+'",'
- }
- else if(typeof data[el] === 'undefined'){
- text+= null+','
- }
-
- if(parent.length===i || Object.keys(parent).length===i){
- text=text.slice(0,-1)
- type==="object"? text+= '},':text+= '],'
- }
-
- }
-
- return data
- }
- stringifyNested(parent)
- return text.slice(0,-1)
- }
-
- const arr = [1,"string", null, undefined, {a: 15, b: 10, c: [1,2,3,4],d: undefined, e: true }, true, false]
- const jsonString = stringify(arr) //напишите функцию stringify без использования JSON.stringify
- console.log(JSON.parse(jsonString)) //не должно поломаться и должно вернуть структуру, во всем схожую с оригинальным arr или table
- }
-
-
|