Graf15 %!s(int64=2) %!d(string=hai) anos
pai
achega
32a5fdd3f2
Modificáronse 2 ficheiros con 657 adicións e 0 borrados
  1. 85 0
      js/js_06/index.html
  2. 572 0
      js/js_06/index.js

+ 85 - 0
js/js_06/index.html

@@ -0,0 +1,85 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <title>Document</title>
+    <!--<script src="index.js"></script>-->
+    <script>   
+{
+    const persons = [
+   {
+      "Name":"chevrolet chevelle malibu",
+      "Cylinders":8,
+      "Displacement":307,
+      "Horsepower":130,
+      "Weight_in_lbs":3504,
+      "Origin":"USA"
+   },
+   {
+      "Name":"buick skylark 320",
+      "Miles_per_Gallon":15,
+      "Cylinders":8,
+      "Displacement":350,
+      "Horsepower":165,
+      "Weight_in_lbs":3693,
+      "Acceleration":11.5,
+      "Year":"1970-01-01",
+   },
+   {
+      "Miles_per_Gallon":18,
+      "Cylinders":8,
+      "Displacement":318,
+      "Horsepower":150,
+      "Weight_in_lbs":3436,
+      "Year":"1970-01-01",
+      "Origin":"USA"
+   },
+   {
+      "Name":"amc rebel sst",
+      "Miles_per_Gallon":16,
+      "Cylinders":8,
+      "Displacement":304,
+      "Horsepower":150,
+      "Year":"1970-01-01",
+      "Origin":"USA"
+   },
+]
+
+    let arrColumn = [];
+    for ( let obj of persons){
+
+        for (let key in obj ){
+            if ( !(arrColumn.includes(key)) ) {arrColumn.push(key)}
+        }
+    }
+
+    let table = '<table>';
+    
+    table += '<tr>'
+        for (let th of arrColumn){
+            table += '<th>' + th + '</th>'
+        }
+    table += '</tr>'
+
+    for ( let obj of persons) {
+        table += '<tr>';
+
+        for (column of arrColumn){
+            table += '<td>'
+                if (obj[column]) { table += obj[column] }
+            table += '</td>'
+        }
+        table += '</tr>';
+    }
+
+    table += '</table>'
+    document.write(table)
+}
+       </script>
+</head>
+<body>
+   
+</body>
+</html>

+ 572 - 0
js/js_06/index.js

@@ -0,0 +1,572 @@
+//Literals
+//Найдите несколько окружающих объектов реального мира и создайте соответственные объекты Javascript. Например:
+
+{
+    const phone = {
+        brand: 'Xiaomi',
+        model: 'mi11',
+        year: '2021',
+        memory: '256'
+    }
+}
+
+//Literals expand
+//Дайте возможность пользователю добавить любые два свойства в эти объекты с любыми значениями. Обеспечьте ввод названия ключа и значения через prompt прямо в литерале объекта {}
+
+{
+    const yourPhone = {
+        [prompt('свойство 1')]: prompt('значение  свойства 1'),
+        [prompt('свойство 2')]: prompt('значение  свойства 2'),
+        [prompt('свойство 3')]: prompt('значение  свойства 3'),
+    }
+}
+
+//Literals copy
+//Пусть пользователь введет еще одно свойство в переменную. Вставьте в новый объект эту переменную. Скопируйте объект из предыдущего задания в новый объект.
+
+{
+    const yourPhone = {
+        [prompt('свойство 1')]: prompt('значение  свойства 1'),
+        [prompt('свойство 2')]: prompt('значение  свойства 2'),
+    }
+
+
+    const property = prompt()
+    const objNew = {
+    [property] : 25,
+    ...yourPhone
+    } 
+}
+
+//Html tree
+/*
+<body>
+        <div>
+            <span>Enter a data please:</span><br/>
+            <input type='text' id='name'>
+            <input type='text' id='surname'>
+        </div>
+        <div>
+            <button id='ok'>OK</button>
+            <button id='cancel'>Cancel</button>
+        </div>
+    </body>
+*/
+/*Сделайте декларативную JSON-структуру для тэгов выше, в которой:
+каждый тэг будет объектом
+имя тэга будет полем tagName
+вложенные тэги будут в поле children
+набор аттрибутов тэга будет в поле attrs.*/
+
+{
+    const body = {
+        tagName : 'body',
+        children : [
+            {
+                tagName : 'div',
+                children : [
+                    {
+                        tagName : 'span',
+                        children : ['Enter a data please:']
+                    },
+                    {
+                        tagName : 'br'
+                    },
+                    {
+                        tagName : 'input',
+                        attrs : {
+                            type : 'text',
+                            id : 'name'
+                        }
+                    },
+                    {
+                        tagName : 'input',
+                        attrs : {
+                            type : 'text',
+                            id : 'surname',
+                        }
+                    }
+                ]
+            },
+            {
+                tagName : 'div',
+                children : [
+                    {
+                        tagName : 'button',
+                        attrs : {
+                            id : 'ok'
+                        },
+                        children : ['OK']
+                    },
+                    {
+                        tagName : 'button',
+                        attrs : {
+                            id : 'cancel'
+                        },
+                        children : 'Cancel'
+                    },
+                ]
+            }
+        ]
+    }
+// Выведите значения текста во второй кнопке, используя . и [].
+
+console.log( body.children[1].children[1].children ) ;
+
+//Выведите значение атрибута id во втором input, используя . и [].
+
+console.log( body.children[0].children[3].attrs.id ) ;
+
+}
+
+// Parent
+// Добавьте каждому объекту тэга из предыдущего задания связь с родителем, используя свойство parent и присвоение
+
+{
+    const body = {
+        tagName : 'body',
+        children : [
+            {
+                tagName : 'div',
+                children : [
+                    {
+                        tagName : 'span',
+                        children : ['Enter a data please:']
+                    },
+                    {
+                        tagName : 'br'
+                    },
+                    {
+                        tagName : 'input',
+                        attrs : {
+                            type : 'text',
+                            id : 'name'
+                        }
+                    },
+                    {
+                        tagName : 'input',
+                        attrs : {
+                            type : 'text',
+                            id : 'surname',
+                        }
+                    }
+                ]
+            },
+            {
+                tagName : 'div',
+                children : [
+                    {
+                        tagName : 'button',
+                        attrs : {
+                            id : 'ok'
+                        },
+                        children : ['OK']
+                    },
+                    {
+                        tagName : 'button',
+                        attrs : {
+                            id : 'cancel'
+                        },
+                        children : 'Cancel'
+                    },
+                ]
+            }
+        ]
+    }
+
+    body.children[0].parent = body;
+    body.children[0].children[0].parent = body.children[0];
+    body.children[0].children[1].parent = body.children[0];
+    body.children[0].children[2].parent = body.children[0];
+    body.children[0].children[3].parent = body.children[0];
+    body.children[1].parent = body;
+    body.children[1].children[0].parent = body.children[1];
+    body.children[1].children[1].parent = body.children[1];
+
+}
+
+//Change OK
+//Добавьте(или измените) любой введенный пользователем атрибут тэга <button id='ok'> из задания HTML Tree. Пользователь также вводит значение этого атрибута.
+
+{
+    const body = {
+        tagName : 'body',
+        children : [
+            {
+                tagName : 'div',
+                children : [
+                    {
+                        tagName : 'span',
+                        children : ['Enter a data please:']
+                    },
+                    {
+                        tagName : 'br'
+                    },
+                    {
+                        tagName : 'input',
+                        attrs : {
+                            type : 'text',
+                            id : 'name'
+                        }
+                    },
+                    {
+                        tagName : 'input',
+                        attrs : {
+                            type : 'text',
+                            id : 'surname',
+                        }
+                    }
+                ]
+            },
+            {
+                tagName : 'div',
+                children : [
+                    {
+                        tagName : 'button',
+                        attrs : {
+                            id : 'ok'
+                        },
+                        children : ['OK']
+                    },
+                    {
+                        tagName : 'button',
+                        attrs : {
+                            id : 'cancel'
+                        },
+                        children : 'Cancel'
+                    },
+                ]
+            }
+        ]
+    }
+
+    body.children[0].parent = body;
+    body.children[0].children[0].parent = body.children[0];
+    body.children[0].children[1].parent = body.children[0];
+    body.children[0].children[2].parent = body.children[0];
+    body.children[0].children[3].parent = body.children[0];
+    body.children[1].parent = body;
+    body.children[1].children[0].parent = body.children[1];
+    body.children[1].children[1].parent = body.children[1];
+
+    const buttonIdOk = prompt("введите атрибут <button id='ok'> кторый хотите добавить или изменить");
+    const buttonIdOkValue = prompt("введите значение атрибута " + buttonIdOk);
+    body.children[1].children[0].attrs[buttonIdOk] = buttonIdOkValue
+    
+
+//Destructure
+//Используя деструктуризацию структуры из задания HTML Tree, Выведите значения текста в тэге span, Выведите значения текста во второй кнопке и Выведите значение атрибута id во втором input.
+
+
+    const {children : [
+        {children : [
+            {children:[span]},
+            {},
+            {},
+            {attrs :{id:id}}
+        ]},
+        {children : [
+            {},
+            {children : button2}
+        ]}
+    ]} = body
+    console.log(span, button2, id)
+
+}
+
+//Destruct array
+/*let arr = [1,2,3,4,5, "a", "b", "c"]
+напишите код, который используя деструктуризацию положит:
+четные числа в переменные even1, even2,
+нечетные в odd1, odd2, odd3,
+буквы в отдельный массив */
+
+{
+    let arr = [1,2,3,4,5, "a", "b", "c"];
+    const [odd1, even1, odd2, even2, odd3, ...Literals] = arr
+}
+
+//Destruct string
+/*let arr = [1, "abc"]
+напишите код, который используя деструктуризацию положит:
+число в переменную number
+букву a в переменную s1
+букву b в переменную s2
+букву c в переменную s3*/
+
+{
+    let arr = [1, "abc"]
+    const [number, [s1, s2, s3]] = arr
+}
+
+/*Destruct 2
+let obj = {name: 'Ivan',
+           surname: 'Petrov',
+           children: [{name: 'Maria'}, {name: 'Nikolay'}]}
+извлеките используя деструктуризацию имена детей в переменные name1 и name2*/
+{
+    let obj = {name: 'Ivan',
+        surname: 'Petrov',
+        children: [{name: 'Maria'}, {name: 'Nikolay'}]}
+
+    let {children:[{name: name1},{name: name2}]} = obj
+}
+
+/*Destruct 3
+let arr = [1,2,3,4, 5,6,7,10]
+извлеките используя деструктуризацию объектов два первых элемента и длину массива в переменные a, b и length*/
+
+{
+    let arr = [1,2,3,4, 5,6,7,10];
+    let {1 : a,
+         2 : b,
+         length : length} = arr;
+}
+
+/*Copy delete
+Сделайте копию одного из объектов из задания Literals без ключа, который введет пользователь.*/
+
+{
+    const phone = {
+        brand: 'Xiaomi',
+        model: 'mi11',
+        year: '2021',
+        memory: '256'
+    }
+
+    const newObj = {...phone}
+}
+
+/*Currency real rate
+Ниже приведен код, который скачивает актуальную информацию о курсах валют. Скопируйте ссылку из него вставьте в браузер интереса ради. Реализуйте калькулятор обмена валют следующим образом:
+Пользователь вводит исходную валюту
+Пользователь вводит валюту, в которую происходит конвертация
+Пользователь вводит сумму в исходной валюте
+Пользовател видит результат конвертации*/
+{
+    let currencyStart = prompt('Пользователь вводит исходную валюту').toUpperCase();
+        let currencyFinish = prompt('Пользователь вводит валюту, в которую происходит конвертация').toUpperCase();
+        let summStart = +prompt('Пользователь вводит сумму в исходной валюте');
+        let rateStart
+        let rateFinish
+
+fetch('https://open.er-api.com/v6/latest/USD').then(res => res.json())
+            .then(data => {
+                    //эта функция запускается когда данные скачиваются.
+                    //остальной код работает РАНЬШЕ.
+                    //только ТУТ есть переменная data со скачанными данными
+                    console.log(data) //изучите структуру, получаемую с сервера в консоли
+                    rateStart = data.rates[currencyStart];
+                    console.log('rateStart' + rateStart);
+                    rateFinish = data.rates[currencyFinish];
+                    console.log('rateFinish' + rateFinish);
+                    summStart / rateStart * rateFinish ? alert(summStart / rateStart * rateFinish) : alert('вы ввели какую -то дичь!')
+                })
+}
+/*Учтите, что пользователь может ввести какую-то дичь или название валют в неверном регистре*/
+
+//Currency drop down
+//Сделайте выпадающий список с названиями всех валют, используя код из прошлого задания и накопление HTML-тэгов в строковой переменной. Для выпадающих списков в HTML предусмотрены тэги <select> и <option>
+
+{
+    fetch('https://open.er-api.com/v6/latest/USD').then(res => res.json())
+    .then(data => {
+
+        console.log(data)
+        let select = '<select>'
+        for (let currency in data.rates){
+            select += '<option>' + currency + '</option>'
+        }
+        select += '</select>'
+        document.write(select)
+       })
+
+}
+
+/*Currency table
+Сделайте двумерную таблицу с курсами между всеми возможными парами валют по типу таблицы Пифагора, используя заготовку из задания Currency real rate:
+
+Используйте только один запрос на сервер. Используйте расчет кросскурса для вычисления курса между любой парой валют*/
+
+{
+    fetch('https://open.er-api.com/v6/latest/USD').then(res => res.json())
+    .then(data => {
+
+        let table = '<table>'
+            table += '<tr><td></td>'
+            for (let currency in data.rates){
+            table += '<td>' + currency + '</td>'
+        }
+        table += '</tr>'
+        
+
+        for (let currencyStart in data.rates){
+            table += '<tr><td>' + currencyStart + '</td>';
+
+            
+                for (let currencyFinish in data.rates) {
+                
+                    table += `<td>${data.rates[currencyFinish] / data.rates[currencyStart]}</td>`
+                
+                }
+                
+        }
+        table += '</table>'
+        document.write(table)
+    
+    })
+}
+
+/*Form
+Напишите код, который их любого объекта создает форму HTML. Например для такого объекта:
+const car = {
+      "Name":"chevrolet chevelle malibu",
+      "Cylinders":8,
+      "Displacement":307,
+      "Horsepower":130,
+      "Weight_in_lbs":3504,
+      "Origin":"USA",
+      "in_production": false
+}
+На экране должна появиться форма из 7 строк, с названиями полей, взятыми из ключей и полями ввода соответствующих типов. Значениями полей ввода должны быть значения из объекта.
+<form>
+    <label>Name: <input type="text" value="chevrolet chevelle malibu"/></label>
+    <label>Cylinders: <input type="number" value="8"/></label>
+    <label>Displacement: <input type="number" value="307"/></label>
+    <label>Horsepower: <input type="number" value="130"/></label>
+    <label>Weight_in_lbs: <input type="number" value="3504"/></label>
+    <label>Origin: <input type="text" value="USA"/></label>
+    <label>in_production: <input type="checkbox" /></label>
+</form>
+Для создания правильного типа тэга input используйте оператор typeof Javascript:
+console.log(typeof 5)//number
+console.log(typeof "5") //string
+console.log(typeof (5 > 2)) //boolean
+
+Соответствие типов
+JS        HTML
+number  number
+string  text
+boolean checkbox*/
+
+{
+    const car = {
+        "Name":"chevrolet chevelle malibu",
+        "Cylinders":8,
+        "Displacement":307,
+        "Horsepower":130,
+        "Weight_in_lbs":3504,
+        "Origin":"USA",
+        "in_production": false
+  }
+
+    let form = '<form>'
+
+    for (let label in car){
+        form += '<label>' + label +':';
+        let type = typeof car[label];
+        let typeHtml
+        if (type === "number") typeHtml = "number";
+        if (type === "string") typeHtml = "text";
+        if (type === "boolean") typeHtml = "checkbox";
+
+        form += `<input type="${typeHtml}" value="${car[label]}"/>`
+        
+        form += '</label>';
+    }
+    document.write(form)
+}
+
+//Table
+/*
+Даден любой массив с объектами
+
+const persons = [
+        {
+            name: 'Мария',
+            fatherName: 'Ивановна',
+            surname: 'Иванова',
+            sex: 'female'
+        },
+        {
+            name: 'Николай',
+            fatherName: 'Иванович',
+            surname: 'Иванов',
+            age: 15
+        },
+        {
+            name: 'Петр',
+            fatherName: 'Иванович',
+            surname: 'Иванов',
+            married: true
+        },
+]
+
+Сформировать таблицу (используя накопление тэгов HTML в строке):
+
+name     fatherName      surname     sex     age     married
+Мария    Ивановна       Иванова     female
+Николай  Иванович       Иванов               15
+Петр     Иванович       Иванов                          true
+
+Алгоритм решения
+Перед непосредственно формированием строк таблицы надо знать все колонки. Для этого нужно предварительно перебрать все объекты и извлечь из них все ключи, что бы сформировать общее множество ключей.
+Первый проход - поиск колонок
+Перебираем массив объектов, перебираем ключи каждого объекта и добавляем в массив колонок, если этого ключа еще там нет. Для примера выше массив получится в шесть элементов. На этом этапе строку HTML создавать еще рано.
+Заголовок
+Начинаем создание таблицы. Используя массив колонок формируем одну строку таблицы с заголовками
+Второй проход - отображение таблицы
+Перебираем массив объектов, перебираем массив колонок для каждого объекта, и используем название колонки как ключ*/
+
+{
+    const persons = [
+        {
+            name: 'Мария',
+            fatherName: 'Ивановна',
+            surname: 'Иванова',
+            sex: 'female'
+        },
+        {
+            name: 'Николай',
+            fatherName: 'Иванович',
+            surname: 'Иванов',
+            age: 15
+        },
+        {
+            name: 'Петр',
+            fatherName: 'Иванович',
+            surname: 'Иванов',
+            married: true
+        },
+    ]
+
+    let arrColumn = [];
+    for ( let obj of persons){
+
+        for (let key in obj ){
+            if ( !(arrColumn.includes(key)) ) {arrColumn.push(key)}
+        }
+    }
+
+    let table = '<table>';
+    
+    table += '<tr>'
+        for (let th of arrColumn){
+            table += '<th>' + th + '</th>'
+        }
+    table += '</tr>'
+
+    for ( let obj of persons) {
+        table += '<tr>';
+
+        for (column of arrColumn){
+            table += '<td>'
+                if (obj[column]) { table += obj[column] }
+            table += '</td>'
+        }
+        table += '</tr>';
+    }
+
+    table += '</table>'
+    document.write(table)
+}