Browse Source

HW 05 done

Olga_Brekhuntsova 2 years ago
parent
commit
ffdcfe2d5f

+ 4 - 4
hw-js-04-structures-evaluations-loops/js/task-01.js

@@ -115,17 +115,17 @@ const body = {
                 [
                     {
                         tagName: "button",
-                        text: "OK",
                         attrs: {
                             id: "ok"
-                        }
+                        },
+                         text: "OK"
                     },
                     {
                         tagName: "button",
-                        text: "Cancel",
                         attrs: {
                             id: "cancel"
-                        }
+                        },
+                        text: "Cancel"
                     }
                 ]
         }

+ 3 - 0
hw-js-05-objects-in-json/.vscode/settings.json

@@ -0,0 +1,3 @@
+{
+  "liveServer.settings.port": 5501
+}

+ 18 - 0
hw-js-05-objects-in-json/index.html

@@ -0,0 +1,18 @@
+<!DOCTYPE html>
+<html lang="ru">
+<head>
+    <meta charset="UTF-8" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+    <title>nix-js-05-objects-in-json</title>
+</head>
+
+<body style="padding:30px; font-family:Anonymous Pro, monospace">
+    <h1>objects-in-json</h1>
+    <div id='root'></div>
+    <script src="/js/task-01.js" type="module"></script>
+    <script src="/js/task-02.js" type="module"></script>
+    <script src="/js/task-03.js" type="module"></script>
+ <script src="/js/task-04.js" type="module"></script>  
+</body>
+
+</html>

+ 461 - 0
hw-js-05-objects-in-json/js/task-01.js

@@ -0,0 +1,461 @@
+// 3 persons
+
+// -------------УСЛОВИЕ-------------
+// Сделать три ассоциативных массива a, b, c, в каждом из которых должны быть поля name и surname.
+
+// -------------РЕШЕНИЕ-------------
+
+const task01block = document.createElement('div');
+task01block.style = "border: 2px solid green; border-radius:5px; margin-bottom:10px; padding:10px";
+const task01title = document.createElement('h2');
+task01title.innerText = 'Task-01 3 persons';
+const obja1 = document.createElement('p');
+const objb1 = document.createElement('p');
+const objc1 = document.createElement('p');
+root.appendChild(task01block); 
+task01block.appendChild(task01title); 
+
+
+class PersonObj {
+    constructor() {
+        this.name = "";
+        this.surname = "";
+    }
+}  
+
+const a = new PersonObj();
+const b = new PersonObj();
+const c = new PersonObj();
+a.name ='Боб';
+a.surname = 'Губка';
+b.name ='Патрик';
+b.surname = 'Звезда';
+c.name ='Сквидварт';
+c.surname ='Осьминог';
+obja1.innerText = `a=${JSON.stringify(a)}`;
+objb1.innerText = `b=${JSON.stringify(b)}`;
+objc1.innerText = `c=${JSON.stringify(c)}`;
+
+task01block.appendChild(obja1);
+task01block.appendChild(objb1);
+task01block.appendChild(objc1);
+// different fields
+
+// -------------УСЛОВИЕ-------------
+// Добавьте некоторые другие поля (например age, fathername, sex (пол)) так, что бы набор полей отличался у разных объектов
+
+// -------------РЕШЕНИЕ-------------
+
+const task02block = document.createElement('div');
+task02block.style = "border: 2px solid green; border-radius:5px; margin-bottom:10px; padding:10px";
+const task02title = document.createElement('h2');
+task02title.innerText = 'Task-02 Different fields';
+const obja2 = document.createElement('p');
+const objb2 = document.createElement('p');
+const objc2 = document.createElement('p');
+root.appendChild(task02block); 
+task02block.appendChild(task02title); 
+a.age = '25';
+b.fathername = 'Патрикович';
+c.sex = 'Мужчина';
+obja2.innerText = `a=${JSON.stringify(a)}`;
+objb2.innerText = `b=${JSON.stringify(b)}`;
+objc2.innerText = `c=${JSON.stringify(c)}`;
+
+task02block.appendChild(obja2);
+task02block.appendChild(objb2);
+task02block.appendChild(objc2);
+
+// fields check
+
+// -------------УСЛОВИЕ-------------
+// Проверьте наличие необязательных полей у каждого из этих массивов.Если поле найдено, выведите его с помощью alert.
+// Проверку делайте по typeof или in в if.
+
+// -------------РЕШЕНИЕ-------------
+
+const task03block = document.createElement('div');
+task03block.style = "border: 2px solid green; border-radius:5px; margin-bottom:10px; padding:10px";
+const task03title = document.createElement('h2');
+task03title.innerText = 'Task-03 Fields check';
+const checkBtn = document.createElement('button');
+checkBtn.innerText = 'Check the fields';
+checkBtn.style = 'margin-bottom:10px';
+root.appendChild(task03block); 
+task03block.appendChild(task03title); 
+task03block.appendChild(checkBtn); 
+
+const combinePersons = [ a, b, c ];
+a.id = 'a';
+b.id = 'b';
+c.id = 'c';
+
+checkBtn.onclick = () => {
+    for (let person of combinePersons) {
+        for (let key in person) {
+            if (!(key === 'name' || key === 'surname'||key === 'id')) { alert(`В объекте {${person.id}} есть необязятельное поле '${key}'`) }
+                    }
+    }
+}
+
+// array of persons
+
+// -------------УСЛОВИЕ-------------
+// Добавьте несколько ассоциативных массивов с персонами в обычный массив persons, например a, b, c. 
+// Также добавьте персону литерально({ ...}).Получится обычный массив с элементами - ассоциативными массивами с персонами.
+
+// -------------РЕШЕНИЕ-------------
+const task04block = document.createElement('div');
+task04block.style = "border: 2px solid green; border-radius:5px; margin-bottom:10px; padding:10px";
+const task04title = document.createElement('h2');
+const obj4 = document.createElement('p');
+task04title.innerText = 'Task-04 Array of persons';
+root.appendChild(task04block); 
+task04block.appendChild(task04title); 
+
+let persons = [a, b, c];
+persons = [...persons, { name: 'Ларри', surname: 'Лобстер' }];
+obj4.innerText = `persons=${JSON.stringify(persons)}`;
+task04block.appendChild(obj4);
+
+// loop of persons
+
+// -------------УСЛОВИЕ-------------
+// Сделайте цикл, который выводит весь массив persons в форме объектов console.log(persons[i])
+
+// -------------РЕШЕНИЕ-------------
+
+const task05block = document.createElement('div');
+task05block.style = "border: 2px solid green; border-radius:5px; margin-bottom:10px; padding:10px";
+const task05title = document.createElement('h2');
+task05title.innerText = 'Task-05 Loop of persons';
+const objOutputBtn = document.createElement('button');
+objOutputBtn.innerText = 'Start console output';
+objOutputBtn.style = 'margin-bottom:10px';
+root.appendChild(task05block); 
+task05block.appendChild(task05title); 
+task05block.appendChild(objOutputBtn); 
+objOutputBtn.onclick = () => { 
+    for (let i = 0; i < persons.length; i++) { console.log({ ...persons[i] }) };
+}
+
+// loop of name and surname
+
+// -------------УСЛОВИЕ-------------
+// Сделайте цикл, который выводит весь массив persons, но только Имя и Фамилию каждой персоны.
+
+// -------------РЕШЕНИЕ-------------
+
+const task06block = document.createElement('div');
+task06block.style = "border: 2px solid green; border-radius:5px; margin-bottom:10px; padding:10px";
+const task06title = document.createElement('h2');
+const task06comment = document.createElement('p');
+task06comment.innerText = 'Как я поняла, нужно выводить не массивы Object.entries, а именно объекты с 2мя полями. Реализовала путем копирования данных в другой массив объектов и удаления ненужных полей. Или как надо было?';
+task06title.innerText = 'Task-06 Loop of name and surname';
+const objNameSurnameOutputBtn = document.createElement('button');
+objNameSurnameOutputBtn.innerText = 'Start console Name&Surname output';
+objNameSurnameOutputBtn.style = 'margin-bottom:10px';
+
+root.appendChild(task06block); 
+task06block.appendChild(task06title); 
+task06block.appendChild(task06comment); 
+task06block.appendChild(objNameSurnameOutputBtn); 
+ 
+objNameSurnameOutputBtn.onclick = () => {
+    for (let i = 0; i < persons.length; i++) {
+        const subPersons = persons[i];
+        for (let key in subPersons) {
+            if (!(key==='name' || key==='surname'))
+             { delete subPersons[key]}
+        }
+        console.log({ ...subPersons });
+        }
+ }
+
+ // loop of loop of values
+
+// -------------УСЛОВИЕ-------------
+// Сделайте цикл, который выводит весь массив persons, но только значения всех полей из объектов. 
+// Используйте вложенный цикл
+
+// -------------РЕШЕНИЕ-------------
+const task07block = document.createElement('div');
+task07block.style = "border: 2px solid green; border-radius:5px; margin-bottom:10px; padding:10px";
+const task07title = document.createElement('h2');
+task07title.innerText = 'Task-07  Loop of loop of values';
+const valuesOutputBtn = document.createElement('button');
+valuesOutputBtn.innerText = 'Start consol values output';
+valuesOutputBtn.style = 'margin-bottom:10px';
+
+root.appendChild(task07block); 
+task07block.appendChild(task07title); 
+task07block.appendChild(valuesOutputBtn); 
+ 
+valuesOutputBtn.onclick = () => {
+        for (let i = 0; i < persons.length; i++) {
+            for (let value of Object.values(persons[i])) {
+                 console.log(value);
+                   }
+       
+        }
+ }
+
+ // fullName
+
+// -------------УСЛОВИЕ-------------
+// Сделайте цикл, которых добавляет поле fullName в каждый объект, содержащий ФИО.
+// Учтите, что поле fathername не является обязательным.
+
+// -------------РЕШЕНИЕ-------------
+
+const task08block = document.createElement('div');
+task08block.style = "border: 2px solid green; border-radius:5px; margin-bottom:10px; padding:10px";
+const task08title = document.createElement('h2');
+const task08startArray = document.createElement('p');
+task08startArray.innerText = `Начальный массив persons=${JSON.stringify(persons)}`;
+task08title.innerText = 'Task-08 FullName';
+const addFullNameBtn = document.createElement('button');
+addFullNameBtn.innerText = 'Добавить поле fullName';
+addFullNameBtn.style = 'margin-bottom:10px';
+root.appendChild(task08block); 
+task08block.appendChild(task08title);
+task08block.appendChild(task08startArray);  
+task08block.appendChild(addFullNameBtn); 
+
+
+addFullNameBtn.onclick = () => {
+    for (let i = 0; i < persons.length; i++) {
+        persons[i].fullname = persons[i].surname + ' ' + persons[i].name+((persons[i].fathername)?(" "+persons[i].fathername):'');
+         }
+    const task08finalArray = document.createElement('p');
+    task08finalArray.innerText = `Обновленный массив persons=${JSON.stringify(persons)}`;
+    task08block.appendChild(task08finalArray);  
+}
+ 
+// serialize
+
+// -------------УСЛОВИЕ-------------
+// Создайте JSON-строку из persons
+
+// -------------РЕШЕНИЕ-------------
+
+const task09block = document.createElement('div');
+task09block.style = "border: 2px solid green; border-radius:5px; margin-bottom:10px; padding:10px";
+const task09title = document.createElement('h2');
+task09title.innerText = 'Task-09 Serialize';
+const convertJSONBtn = document.createElement('button');
+convertJSONBtn.innerText = 'Вывести JSON-строку persons в консоль';
+convertJSONBtn.style = 'margin-bottom:10px';
+root.appendChild(task09block); 
+task09block.appendChild(task09title); 
+task09block.appendChild(convertJSONBtn); 
+convertJSONBtn.onclick = () => { 
+    console.log(JSON.stringify(persons));
+   }
+
+// deserialize
+
+// -------------УСЛОВИЕ-------------
+// Создайте ассоциативный массив с одной персоной из JSON-строки. Добавьте её в persons
+
+// -------------РЕШЕНИЕ-------------
+
+const task10block = document.createElement('div');
+task10block.style = "border: 2px solid green; border-radius:5px; margin-bottom:10px; padding:10px";
+const task10title = document.createElement('h2');
+task10title.innerText = 'Task-10 Deserialize';
+const addJsonBtn = document.createElement('button');
+addJsonBtn.innerText = 'Добавить JSON-персону в persons';
+addJsonBtn.style = 'margin-bottom:10px';
+root.appendChild(task10block); 
+task10block.appendChild(task10title); 
+task10block.appendChild(addJsonBtn); 
+addJsonBtn.onclick = () => { 
+    const jsonPerson = '{ "name": "Сэнди", "surname": "Белка" }';
+    console.log(jsonPerson);
+    persons.push(JSON.parse(jsonPerson));
+    console.log(persons);
+    const task10persons = document.createElement('p');
+    task10persons.innerText = `newPersons=${JSON.stringify(persons)}`;
+    task10block.appendChild(task10persons);
+}
+      
+// HTML
+
+// -------------УСЛОВИЕ-------------
+// Сделайте цикл, который выводит весь массив persons, в форме HTML-таблицы. Имя и Фамилия - колонки.
+// Пример кода:
+// var str = "<table border='1'>"
+// for (let i=0;i<1;i++){
+//     str += `<tr><td>${i}</td><td>адын</td></tr>`
+// }
+// str += "</table>"
+
+// console.log(str)
+// document.write(str)
+// Модифицируйте код так, чтобы он выводил массив persons
+
+// -------------РЕШЕНИЕ-------------
+const task11block = document.createElement('div');
+task11block.style = "border: 2px solid green; border-radius:5px; margin-bottom:10px; padding:10px";
+const task11title = document.createElement('h2');
+task11title.innerText = 'Task-11 HTML';
+const makeTableBtn = document.createElement('button');
+makeTableBtn.innerText = 'Сформировать таблицу';
+makeTableBtn.style = 'margin-bottom:11px';
+root.appendChild(task11block); 
+task11block.appendChild(task11title); 
+task11block.appendChild(makeTableBtn); 
+makeTableBtn.onclick = () => {
+    var str = "<table border='1'><caption>Persons</caption><tr><th>№</th><th>Name</th><th>Surname</th>"
+ for (let i=0;i<persons.length;i++){
+    str += `<tr><td>&nbsp${i+1}&nbsp</td><td>&nbsp${persons[i].name}&nbsp</td><td>&nbsp${persons[i].surname}&nbsp</td></tr>`
+}
+str += "</table>"
+    const task11table = document.createElement('div');
+    task11table.innerHTML = str;
+    console.log(str);
+    task11block.appendChild(task11table);
+}
+ 
+// HTML optional fields
+
+// -------------УСЛОВИЕ-------------
+// Сделайте цикл, который выводит весь массив persons, в форме HTML - таблицы. 
+// Имя и Фамилия, а также другие поля при наличии. Колонки: поля, строки таблицы - персоны.
+
+// -------------РЕШЕНИЕ-------------
+const task12block = document.createElement('div');
+task12block.style = "border: 2px solid green; border-radius:5px; margin-bottom:10px; padding:10px";
+const task12title = document.createElement('h2');
+task12title.innerText = 'Task-12 HTML optional fields';
+const makeAllFieldsTableBtn = document.createElement('button');
+makeAllFieldsTableBtn.innerText = 'Сформировать таблицу с полным перечнем полей';
+makeAllFieldsTableBtn.style = 'margin-bottom:12px';
+root.appendChild(task12block); 
+task12block.appendChild(task12title); 
+task12block.appendChild(makeAllFieldsTableBtn); 
+makeAllFieldsTableBtn.onclick = () => {
+    var str = "<table border='1'><caption>Persons</caption><tr><th th >№</th>";
+    let keys = [];
+    let result = [];
+   
+    for (let i = 0; i < persons.length; i++) {
+        keys = Object.keys(persons[i]);
+        result = [...result, ...keys];  
+    }
+   
+    keys=[...new Set(result)];
+    for (let key of keys) {
+        str += `<th>${key}</th>`;
+    }
+        str += `</tr>`;
+    for (let i = 0; i < persons.length; i++){
+        str += `<tr><td>&nbsp person ${i + 1}&nbsp</td>`;
+
+         for (let key of keys) {  
+                (Object.keys(persons[i]).includes(key))?(str += `<td>&nbsp${persons[i][key]}&nbsp</td>`):(str += `<td>&nbsp---&nbsp</td>`);
+            };
+        str += `</tr>`;
+      }
+str += "</table>"
+    const task12table = document.createElement('div');
+    task12table.innerHTML = str;
+    task12block.appendChild(task12table);
+}
+ 
+// HTML tr color
+
+// -------------УСЛОВИЕ-------------
+// Добавьте к предыдущему примеру раскраску через строчку используя другой стиль тэга tr.
+
+// -------------РЕШЕНИЕ-------------
+const task13block = document.createElement('div');
+task13block.style = "border: 2px solid green; border-radius:5px; margin-bottom:10px; padding:10px";
+const task13title = document.createElement('h2');
+task13title.innerText = 'Task-13 HTML tr color';
+const makeColorTrTableBtn = document.createElement('button');
+makeColorTrTableBtn.innerText = 'Form colorful table';
+makeColorTrTableBtn.style = 'margin-bottom:13px';
+root.appendChild(task13block); 
+task13block.appendChild(task13title); 
+task13block.appendChild(makeColorTrTableBtn); 
+makeColorTrTableBtn.onclick = () => {
+    var str = "<table border='1'><caption>Persons</caption><tr><th th >№</th>";
+    let keys = [];
+    let result = [];
+   
+    for (let i = 0; i < persons.length; i++) {
+        keys = Object.keys(persons[i]);
+        result = [...result, ...keys];  
+    }
+   
+    keys=[...new Set(result)];
+    for (let key of keys) {
+        str += `<th>${key}</th>`;
+    }
+        str += `</tr>`;
+    for (let i = 0; i < persons.length; i++){
+        i%2?(str += `<tr><td>&nbsp person ${i + 1}&nbsp</td>`):(str += `<tr style='background-color:rgb(170, 214, 243)'><td>&nbsp person ${i + 1}&nbsp</td>`);
+         for (let key of keys) {  
+                (Object.keys(persons[i]).includes(key))?(str += `<td>&nbsp${persons[i][key]}&nbsp</td>`):(str += `<td>&nbsp---&nbsp</td>`);
+            };
+        str += `</tr>`;
+      }
+str += "</table>"
+    const task13table = document.createElement('div');
+    task13table.innerHTML = str;
+    task13block.appendChild(task13table);
+}
+    
+// HTML th optional
+
+// -------------УСЛОВИЕ-------------
+// Переработайте вывод persons в HTML с поиском всех возможных колонок во всех записях,
+//     выводом названий колонок в заголовок HTML - таблицы.Для решения этой задачи вначале узнайте множество полей(ключей)
+//     во всех записях(они не совпадают), выведите HTML - заголовок используя тэги < th >, а потом выводите все записи.
+//     Ниже выведите все персоны построчно.Следите за корректностью колонок.Для этого вам нужно итерировать общий набор колонок,
+//     а не каждую персону, колонки из которой могут отличаться от предыдущей.
+
+// -------------РЕШЕНИЕ-------------
+
+const task14block = document.createElement('div');
+task14block.style = "border: 2px solid green; border-radius:5px; margin-bottom:10px; padding:10px";
+const task14title = document.createElement('h2');
+const task14comment = document.createElement('p');
+task14title.innerText = 'Task-14 HTML th optional';
+task14comment.innerText = 'Не поняла, чем отличается от 12-го задания (в нем сделала то же самое)';
+const formTable14Btn = document.createElement('button');
+formTable14Btn.innerText = 'Сформировать таблицу';
+formTable14Btn.style = 'margin-bottom:14px';
+root.appendChild(task14block); 
+task14block.appendChild(task14title); 
+task14block.appendChild(task14comment); 
+task14block.appendChild(formTable14Btn); 
+ 
+formTable14Btn.onclick = () => {  var str = "<table border='1'><caption>Persons</caption><tr><th th >№</th>";
+    let keys = [];
+    let result = [];
+   
+    for (let i = 0; i < persons.length; i++) {
+        keys = Object.keys(persons[i]);
+        result = [...result, ...keys];  
+    }
+   
+    keys=[...new Set(result)];
+    for (let key of keys) {
+        str += `<th>${key}</th>`;
+    }
+        str += `</tr>`;
+    for (let i = 0; i < persons.length; i++){
+        str += `<tr><td>&nbsp person ${i + 1}&nbsp</td>`;
+
+         for (let key of keys) {  
+                (Object.keys(persons[i]).includes(key))?(str += `<td>&nbsp${persons[i][key]}&nbsp</td>`):(str += `<td>&nbsp---&nbsp</td>`);
+            };
+        str += `</tr>`;
+      }
+str += "</table>"
+    const task14table = document.createElement('div');
+    task14table.innerHTML = str;
+    task14block.appendChild(task14table); }

+ 198 - 0
hw-js-05-objects-in-json/js/task-02.js

@@ -0,0 +1,198 @@
+// Задание на синий пояс.
+
+// -------------УСЛОВИЕ-------------
+// Сделать HTML-конструктор из деревянной структуры, которая была на прошлом занятии:
+// var someTree = {
+//     tagName: "table", //html tag
+//     subTags: [ //вложенные тэги
+//         {
+//                     tagName: "tr",
+//                     subTags: [
+//                         {
+//                             tagName: "td",
+//                             text: "some text",
+//                         },
+//                         {
+//                             tagName: "td",
+//                             text: "some text 2",
+//                         }
+//                     ]
+//         }
+//     ],
+//     attrs:
+//     {
+//         border: 1,
+//     },
+// }
+
+// Для начала сделайте конструктор для верхнего уровня (в примере - table). Потом с помощью копипасты сделайте то же самое 
+// с вложенным уровнем nestedTags(tr).Аналогично для уровня td.
+// Конструктор должен поддерживать вложенность до 3его уровня (как в примере). 
+// В результате работы конструктора из примера выше должен получиться следующий HTML(в строке str):
+// <table border=1>
+//     <tr>
+//         <td>some text</td>
+//         <td>some text 2</td>
+//     </tr>
+// </table>
+// Переносы строк и отступы в результате не принципиальны, главное - структура HTML Проверьте ваш код на других структурах.
+
+// -------------РЕШЕНИЕ-------------
+const task15block = document.createElement('div');
+task15block.style = "border: 2px solid green; border-radius:5px; margin-bottom:10px; padding:10px";
+const task15title = document.createElement('h2');
+task15title.innerText = 'Task-15 Задание на синий пояс: HTML-конструктор';
+const task15comment = document.createElement('p');
+task15comment.innerText = 'Реализовано построение HTML-дерева любой глубины вложенности';
+const makeTableBtn = document.createElement('button');
+makeTableBtn.innerText = 'Make HTML-table';
+makeTableBtn.style = 'margin-bottom:15px';
+const makeFormBtn = document.createElement('button');
+makeFormBtn.innerText = 'Make HTML-form';
+makeFormBtn.style = 'margin-bottom:15px; margin-left:15px';
+root.appendChild(task15block); 
+task15block.appendChild(task15title); 
+task15block.appendChild(task15comment); 
+task15block.appendChild(makeTableBtn); 
+task15block.appendChild(makeFormBtn); 
+//Функция построения HTML-строки из объекта данных
+let str = '';
+function elementParse(inputData) {
+    
+     const objData=JSON.parse(JSON.stringify(inputData));
+    let strFin = '';
+  
+     for (let key in objData) { 
+         
+                if (key === 'tagName') {
+                    str += '<' + objData[key]+'>' ;
+                    strFin = '</' + objData[key] + '>';
+                                   }
+                if (key === 'attrs') {
+                    str = str.slice(0, -1);
+                    for (let attrKey in objData[key]) { str += ` ${attrKey}="${objData[key][attrKey]}"`; }
+                    str += '>';
+                }
+                    if (key === 'text') {
+                    str += objData[key] ;                                  
+                }
+                     
+        if (key === 'subTags') {
+                let subElements = [...objData[key]];
+            for (let subData of subElements) {
+                             elementParse(subData);
+          
+            }
+         }
+     };
+
+    str += strFin; 
+      }
+
+makeTableBtn.onclick = () => { 
+    str = '';
+    var table = {
+    tagName: 'table',
+    attrs: {
+        border: "1",
+    },
+    subTags: [
+        {
+            tagName: 'tr',
+            subTags: [
+                {
+                    tagName: "td",
+                    text: "1x1",
+                },
+                {
+                    tagName: "td",
+                    text: "1x2",
+                },
+            ]
+        },
+        {
+            tagName: 'tr',
+            subTags: [
+                {
+                    tagName: "td",
+                    text: "2x1",
+                },
+                {
+                    tagName: "td",
+                    text: "2x2",
+                },
+            ]
+        }
+    ]
+    }
+  
+    elementParse(table); 
+    console.log(`HTML:${str}`);  
+    const task15HTML = document.createElement('div');
+    task15HTML.innerHTML = str;
+    task15block.appendChild(task15HTML);
+}
+makeFormBtn.onclick = () => { 
+    str = '';
+    const body = {
+    tagName: "body",
+    subTags: [
+        {
+            tagName: "div",
+            subTags:
+                [
+                    {
+                        tagName: "span",
+                        text: "Enter a data please:"
+                    },
+                    {
+                        tagName: "br"
+                    },
+                    {
+                        tagName: "input",
+                        attrs: {
+                            type: "text",
+                            id: "name"
+                        }
+                    },
+                      {
+                        tagName: "input",
+                        attrs: {
+                            type: "text",
+                            id: "surname"
+                                }
+                       }
+                   ]
+        },
+        {
+            tagName: "div",
+            subTags:
+                [
+                    {
+                        tagName: "button",
+                        attrs: {
+                            id: "ok"
+                        },
+                        text: "OK"
+                    },
+                    {
+                        tagName: "button",
+                        attrs: {
+                            id: "cancel"
+                        },
+                        text: "Cancel"
+                    }
+                ]
+        }
+    ]
+    }
+
+    elementParse(body); 
+    console.log(`HTML:${str}`);  
+    const task15HTML = document.createElement('div');
+    task15HTML.innerHTML = str;
+    task15block.appendChild(task15HTML);
+}
+
+
+

+ 156 - 0
hw-js-05-objects-in-json/js/task-03.js

@@ -0,0 +1,156 @@
+// destruct array
+
+// -------------УСЛОВИЕ-------------
+// let arr = [1,2,3,4,5, "a", "b", "c"]
+// напишите код, который используя деструктуризацию положит:
+// четные числа в переменные even1, even2,
+// нечетные в odd1, odd2, odd3,
+// буквы в отдельный массив
+
+// -------------РЕШЕНИЕ-------------
+const task16block = document.createElement('div');
+task16block.style = "border: 2px solid green; border-radius:5px; margin-bottom:10px; padding:10px";
+const task16title = document.createElement('h2');
+task16title.innerText = 'Task-16 Destruct array';
+const destructArrayBtn = document.createElement('button');
+destructArrayBtn.innerText = 'Destruct array';
+destructArrayBtn.style = 'margin-bottom:16px';
+root.appendChild(task16block); 
+task16block.appendChild(task16title); 
+task16block.appendChild(destructArrayBtn); 
+destructArrayBtn.onclick = () => {
+    let arr = [1, 2, 3, 4, 5, "a", "b", "c"];
+    let [even1, even2, odd1, odd2, odd3, ...rest] = [...arr.filter(elem => !(elem % 2)&&!(isNaN(elem))), ...arr.filter(elem => elem % 2), arr.filter(elem=>isNaN(elem))];
+    console.log([even1, even2, odd1, odd2, odd3, ...rest]);
+  
+    const task16even1 = document.createElement('p');
+    const task16even2 = document.createElement('p');
+    const task16odd1 = document.createElement('p');
+    const task16odd2 = document.createElement('p');
+      const task16odd3 = document.createElement('p');
+    const task16letters = document.createElement('p');
+
+    task16even1.innerText = `even1=${even1}`;
+    task16even2.innerText = `even2=${even2}`;
+    task16odd1.innerText = `odd1=${odd1}`;
+    task16odd2.innerText = `odd2=${odd2}`;
+    task16odd3.innerText = `odd3=${odd3}`;
+    task16letters.innerText = `letters=[${[...rest]}]`;
+    task16block.appendChild(task16even1);
+     task16block.appendChild(task16even2);
+    task16block.appendChild(task16odd1);
+    task16block.appendChild(task16odd2);
+      task16block.appendChild(task16odd3);
+    task16block.appendChild( task16letters);
+   }
+
+// -------------УСЛОВИЕ-------------
+// destruct string
+// let arr = [1, "abc"]
+// напишите код, который используя деструктуризацию положит:
+// число в переменную number
+// букву a в переменную s1
+// букву b в переменную s2
+// букву c в переменную s3
+
+// -------------РЕШЕНИЕ-------------
+const task17block = document.createElement('div');
+task17block.style = "border: 2px solid green; border-radius:5px; margin-bottom:10px; padding:10px";
+const task17title = document.createElement('h2');
+task17title.innerText = 'Task-17 Destruct string';
+const destructStringBtn = document.createElement('button');
+destructStringBtn.innerText = 'Destruct string';
+destructStringBtn.style = 'margin-bottom:16px';
+root.appendChild(task17block); 
+task17block.appendChild(task17title); 
+task17block.appendChild(destructStringBtn); 
+destructStringBtn.onclick = () => {
+    let arr = [1, "abc"]
+    let [number, [s1, s2, s3]] = [...arr.filter(elem => !isNaN(elem)), ...arr.filter(elem => isNaN(elem))];
+    console.log([number, [s1, s2, s3]]);
+        
+    const task17number = document.createElement('p');
+    const task17s1 = document.createElement('p');
+    const task17s2 = document.createElement('p');
+    const task17s3 = document.createElement('p');
+    task17number.innerText = `number=${number}`;
+    task17s1.innerText = `s1=${s1}`;
+    task17s2.innerText = `s2=${s2}`;
+      task17s3.innerText = `s3=${s3}`;
+    task17block.appendChild(task17number);
+    task17block.appendChild(task17s1); 
+    task17block.appendChild(task17s2); 
+    task17block.appendChild( task17s3); 
+    }
+
+// -------------УСЛОВИЕ-------------
+// destruct 2
+// let obj = {name: 'Ivan',
+//            surname: 'Petrov',
+//            children: [{name: 'Maria'}, {name: 'Nikolay'}]}
+// извлеките используя деструктуризацию имена детей в переменные name1 и name2
+
+// -------------РЕШЕНИЕ-------------
+const task18block = document.createElement('div');
+task18block.style = "border: 2px solid green; border-radius:5px; margin-bottom:10px; padding:10px";
+const task18title = document.createElement('h2');
+task18title.innerText = 'Task-18 Destruct 2';
+const outputChildrenBtn = document.createElement('button');
+outputChildrenBtn.innerText = 'Output children names';
+outputChildrenBtn.style = 'margin-bottom:16px';
+root.appendChild(task18block); 
+task18block.appendChild(task18title); 
+task18block.appendChild(outputChildrenBtn); 
+outputChildrenBtn.onclick = () => {
+    let obj = {
+        name: 'Ivan',
+        surname: 'Petrov',
+        children: [{ name: 'Maria' }, { name: 'Nikolay' }]
+    }
+    let [{ name: name1 }, {name:name2 }] = [...[...obj.children]];
+    console.log(`name1:${name1}`)
+    console.log(`name2:${name2}`)
+    const task18childrenName1 = document.createElement('p');
+    const task18childrenName2 = document.createElement('p');
+    task18childrenName1.innerText = `name1:${name1}`;
+      task18childrenName2.innerText = `name2:${name2}`;
+    task18block.appendChild(task18childrenName1); 
+      task18block.appendChild(task18childrenName2); 
+    }
+
+// -------------УСЛОВИЕ-------------
+// destruct 3
+// let arr = [1,2,3,4, 5,6,7,10]
+// извлеките используя деструктуризацию объектов два первых элемента и длину массива в переменные a, b и length
+
+// -------------РЕШЕНИЕ-------------
+
+const task19block = document.createElement('div');
+task19block.style = "border: 2px solid green; border-radius:5px; margin-bottom:10px; padding:10px";
+const task19title = document.createElement('h2');
+task19title.innerText = 'Task-19 Destruct 3';
+const output2elemsAndLengthBtn = document.createElement('button');
+output2elemsAndLengthBtn.innerText = 'Output element1, element2 & array.length';
+output2elemsAndLengthBtn.style = 'margin-bottom:16px';
+root.appendChild(task19block); 
+task19block.appendChild(task19title); 
+task19block.appendChild(output2elemsAndLengthBtn); 
+output2elemsAndLengthBtn.onclick = () => {
+    let arr = [1, 2, 3, 4, 5, 6, 7, 10];
+    let [[a, b], length] = [[...arr, ...arr], arr.length];
+     
+    console.log(`a:${a}`)
+    console.log(`b:${b}`)
+    console.log(`length:${length}`)
+
+    
+    const task19a = document.createElement('p');
+    const task19b = document.createElement('p');
+       const task19length = document.createElement('p');
+    task19a.innerText = `a=${a}`;
+    task19b.innerText = `b=${b}`;
+      task19length.innerText = `length=${length}`;
+    task19block.appendChild(task19a); 
+    task19block.appendChild(task19b); 
+     task19block.appendChild(task19length); 
+    }

+ 100 - 0
hw-js-05-objects-in-json/js/task-04.js

@@ -0,0 +1,100 @@
+//Задание на черный пояс
+
+// -------------УСЛОВИЕ-------------
+// Сделать предыдущее задание на черный пояс в упрощенном виде: не использовать четырехмерный массив для хранения истории,
+// а использовать ассоциативный массив: Например, если пользователь ввел 1212 за последние четыре хода, то мы ищем то, что было введено последний раз после такой последовательности:
+// var history      = "1212"
+// var predictValue = predictArray[history] // в predictValue то, что ввел последний раз пользователь после нажатий 1212
+// var newValue     = prompt("введите 1 или 2","");
+// predictArray[history] = newValue         //сохраняем новый ввод
+//сдвигаем историю
+
+// -------------РЕШЕНИЕ-------------
+const task20block = document.createElement('div');
+task20block.style = "border: 2px solid green; border-radius:5px; margin-bottom:10px; padding:10px";
+const task20title = document.createElement('h2');
+task20title.innerText = 'Task-20 Задание на черный пояс: гадалка';
+const task20comment = document.createElement('p');
+task20comment.innerText = 'Возможно сохранение истории в строку длиной n-символов';
+const playVangaBtn = document.createElement('button');
+playVangaBtn.innerText = 'Play';
+playVangaBtn.style = 'margin-bottom:20px';
+root.appendChild(task20block); 
+task20block.appendChild(task20title); 
+task20block.appendChild(task20comment); 
+task20block.appendChild(playVangaBtn); 
+playVangaBtn.onclick = () => { 
+    let history = '';
+    let predictArray = {};
+    let VangaNumber = null;
+    let step = null;
+    let userNumber = null;
+    const historyDeep=+prompt('Введите кол-во элементов, записываемых в историю')
+ 
+// Формирование 1-го элемента history
+    for (step = 0; step < historyDeep; step++) {
+        VangaNumber = (Math.random() > 0.5) ? 1 : 2;
+        console.log(`Гадалка задумала: ${VangaNumber}`);
+        userNumber = prompt('Введите одно из чисел: 1 или 2','');
+      
+        if (!(userNumber === null)) {
+            if (!(userNumber === "")) {
+                if (userNumber == 1 || userNumber == 2) {
+                    history += userNumber;
+                    VangaNumber == userNumber ? alert(`Гадалка угадала, что ты загадал ${userNumber} `) : alert('Гадалка не угадала твое число')
+                }
+                else {
+                    alert("Ошибка ввода. Нужно ввести число 1 или 2");
+                    step--;
+                }
+            }
+            else {
+                alert("Ошибка ввода. Нужно ввести число 1 или 2");
+                step--;
+            }
+        }
+        else break;
+    }
+    console.log(`history=${ history }`);
+    // Формирование 2-ой и более строк history и внесение статистики в predictArray
+    while (!(userNumber === null)) {
+        //Проверка наличия записи в predictArray
+        if (!(history in predictArray)) { VangaNumber = (Math.random() > 0.5) ? 1 : 2;
+            console.log(`Гадалка задумала: ${VangaNumber}`); }
+        else {  VangaNumber = predictArray[history];
+            console.log(`Гадалка задумала: ${VangaNumber}`);}
+  
+        userNumber = prompt('Введите одно из чисел: 1 или 2','') 
+            if (!(userNumber === null)) {
+                if (!(userNumber === "")) {
+                    if (userNumber == 1 || userNumber == 2) {
+                        VangaNumber == userNumber ? alert(`Гадалка угадала, что ты загадал ${userNumber} `) : alert('Гадалка не угадала твое число');
+                
+                        //Перезапись нужного элемента массива predictArray
+                        predictArray[history] = userNumber;
+                        history+=userNumber;
+                        history=history.slice(1);
+                        console.log(`history=${history}`);
+                        console.log(predictArray);
+                    }
+                    else {
+                        alert("Ошибка ввода. Нужно ввести число 1 или 2");
+                        step--;
+                    }
+                }
+                else {
+                    alert("Ошибка ввода. Нужно ввести число 1 или 2");
+                    step--;
+                }
+            }
+            else break;
+                }
+    console.log(`predictArray=`);
+    console.log(predictArray);
+  const task20predictArray = document.createElement('p');
+    task20predictArray.innerText = `predictArray=${JSON.stringify(predictArray)}`;
+    task20block.appendChild(task20predictArray);
+    }
+
+
+

+ 7 - 0
hw-js-05-objects-in-json/readme.md

@@ -0,0 +1,7 @@
+Каждая задача в отдельном скрипте, чтобы удобнее было проверять.
+Выполнены все задачи на все пояса, и даже больше:
+
+1. треугольник можно строить на любое кол=-во строк
+2. гадалке можно устанавливать кол-во элементов, которые вносятся в историю, и соответственно, глубину многомерного массива статистики predictArray
+
+Хостинг http://hw_js_05.olgapistryak.fe.a-level.com.ua/