123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293 |
- // Рекурсия: HTML tree
- // Используя решение этого задания сделайте функцию, которая рекурсивно создает HTML - строку из древовидной структуры данных Javascript любой вложенности.Проверьте результат работы функции выводя HTML - строку используя document.write или же какой - то_элемент.innerHTML
- {
- function htmlTree(data) {
- let copy
- copy = `<${data.tagName}`
- if (data.attrs) {
- for (const [attrName, attrParam] of Object.entries(data.attrs)) {
- copy += ` ${attrName}='${attrParam}'`
- }
- }
- copy += `>`
- if (data.children) {
- for (const child of data.children) {
- typeof child === 'object' ? copy += htmlTree(child) : copy += `${child}`
- }
- }
- copy += `</${data.tagName}>`
- return copy
- }
- // Проверка
- 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"],
- },
- ]
- }
- ]
- }
- htmlTree(table)
- document.write(htmlTree(table))
- }
- // Рекурсия: DOM tree
- // Используя решение этого задания сделайте функцию, которая рекурсивно создает DOM из древовидной структуры данных Javascript.Задание в целом аналогично предыдущему, однако вместо накопления результата в HTML - строке функция должна добавлять элементы созданные через document.createElement в переданного в функцию родителя.
- {
- function domTree(parent, data) {
- const tag = document.createElement(data.tagName)
- if (data.attrs) {
- for (const [attrName, attrParam] of Object.entries(data.attrs)) {
- tag[attrName] = attrParam
- }
- }
- parent.append(tag)
- if (data.children) {
- for (const child of data.children) {
- typeof child === 'object' ? domTree(tag, child) : tag.innerHTML = child
- }
- }
- }
- // Проверка
- 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)
- }
- // Рекурсия: Deep Copy
- // Напишите функцию, которая рекурсивно осуществляет глубокое копирование структур Javascript, в которых нет циклических связей.
- {
- function deepCopy(data) {
- let copy
- if (Array.isArray(data)) {
- copy = []
- } else if (typeof data === 'object' && data !== null) {
- copy = {}
- } else return data
- for (const item in data) {
- copy[item] = deepCopy(data[item])
- }
- return copy
- }
- // Проверка
- 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 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 table2 = deepCopy(table) //аналогично
- }
- // Рекурсия: My Stringify
- // Напишите аналог JSON.stringify
- {
- function stringify(data) {
- let copy = ''
- if (Array.isArray(data)) {
- copy += `[`
- } else if (typeof data === 'object' && data !== null) {
- copy += `{`
- } else return data
- for (const item in data) {
- if (data[item] == undefined) {
- copy += `${null}`
- } else if (typeof data[item] === 'number' || typeof data[item] === 'boolean') {
- copy += `${data[item]}`
- } else if (typeof data[item] === 'string') {
- copy += `"${data[item]}"`
- } else if (typeof data[item] === 'object' && data[item] !== null) {
- if (typeof data === 'object' && data !== null) {
- copy += `{`
- let i = 1
- for (const [key, value] of Object.entries(data[item])) {
- if (value == undefined) {
- data[item][key] = null
- } else if (typeof value !== 'object') {
- copy += `"${key}":` + (typeof value === 'string' ? `"${value}"` : value)
- if (i < Object.keys(data[item]).length) copy += ','
- } else {
- copy += `"${key}":${stringify(value)}`
- copy += ','
- }
- i++
- }
- }
- copy += `}`
- } else {
- copy += `${stringify(data[item])}`
- }
- if (item < (data.length - 1)) copy += ','
- }
- copy += `${Array.isArray(data) ? ']' : '}'} `
- return copy
- }
- const number = [1, 2, 3, false, "string", { a: 10, b: 'stepan' }]
- let test = stringify(number)
- console.log('sourse: ', JSON.stringify(number))
- console.log('sourse reverse: ', JSON.parse(JSON.stringify(number)))
- console.log('===============================================================================================')
- console.log('result: ', test)
- console.log('result reverse: ', JSON.parse(test))
- const arr = [1, "string", null, undefined, { a: 15, b: 10, c: [1, 2, 3, 4], d: undefined, e: true }, true, false]
- let jsonString = stringify(arr)
- console.log('sourse: ', JSON.stringify(arr))
- console.log('sourse reverse: ', JSON.parse(JSON.stringify(arr)))
- console.log('===============================================================================================')
- console.log('result: ', jsonString)
- console.log('result reverse: ', JSON.parse(jsonString))
- // пока не работает
- let tableParse = stringify(table)
- console.log('sourse: ', JSON.stringify(table))
- console.log('sourse reverse: ', JSON.parse(JSON.stringify(table)))
- console.log('===============================================================================================')
- console.log('result: ', tableParse)
- console.log('result reverse: ', JSON.parse(tableParse))
- }
- // Рекурсия: getElementById throw
- // Напишите функцию getElementById, которая будет аналогична document.getElementById.В качестве основы можете взять материал лекции(walker), однако в цикл перебора children вставьте проверку на нахождение переданного id.При нахождении элемента по id в рекурсивной функции выбрасывайте исключение со значением найденного DOM - элемента, которое будет поймано на уровне вашей функции getElementById, после чего она вернет выброшенный DOM - элемент.
- {
- function getElementById(idToFind) {
- function walker(parent = document.body) {
- for (const child of parent.children) {
- if (child.id == idToFind) {
- throw child
- }
- walker(child)
- }
- }
- try {
- walker()
- }
- catch (e) {
- return console.log(e)
- }
- }
- // http://doc.a-level.com.ua/five-recursion-try-catch-finally-homework
- getElementById('h1-1_0')
- }
|