123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206 |
- 'use strict';
- import htmlObj from './someTree.js';
- //Домашнее задание. Функции 2, ES6
- //Переделайте предыдущее ДЗ используя максимум возможностей ES6. Отметьте облегчение (или утяжеление) синтаксиса.
- // Easier: used loop forEach on row 34 ,and arrow function on row 60
- // Harder : We cant totally replace simple loop from ES5 because it's not suit to use ES6 for already counted iterations
- const table = document.createElement('table');
- for (let i = 0; i < 10; i++) {
- const tr = document.createElement('tr');
- for (let j = 1; j < 11; j++) {
- const td = document.createElement('td');
- td.id = String(i) + String(j);
- td.dataset.col = String(i);
- if (j === 10) {
- td.textContent = String(i);
- tr.prepend(td);
- continue;
- }
- td.textContent = String((i === 0 ? 1 : i) * j);
- tr.append(td);
- }
- table.append(tr);
- }
- document.body.append(table);
- table.onmouseover = function ({
- target: {
- cellIndex,
- tagName,
- id,
- dataset: { col },
- },
- }) {
- this.childNodes.forEach((element) => {
- element.childNodes.forEach((td) => {
- if (td.cellIndex === cellIndex) {
- td.style.backgroundColor = 'yellow';
- } else if (td.dataset.col === col) {
- td.style.backgroundColor = 'orange';
- } else {
- td.style.backgroundColor = 'grey';
- }
- });
- });
- if (tagName === 'TD')
- document.getElementById(id).style.backgroundColor = 'green';
- };
- //Calc
- const btnSubmit = document.getElementById('submitCalc');
- const resultP = document.getElementById('result');
- btnSubmit.addEventListener('click', updateValue);
- function updateValue(e) {
- const values = e.target.parentNode.children;
- resultP.textContent = String(+values[0].value * +values[1].value);
- }
- //Calc Live
- const firstInput = document.getElementById('first');
- const secondInput = document.getElementById('second');
- const handelInputs = (e, inputValue) => {
- resultP.textContent = String(+e.target.value * +inputValue.value);
- };
- firstInput.addEventListener('change', (e) => handelInputs(e, secondInput));
- secondInput.addEventListener('change', (e) => handelInputs(e, firstInput));
- //sort
- //Сделайте обобщенную функцию сортировки массива
- //Функция позволяет отсортировать любой набор данных по имени поля (второй параметр).
- //Третьим параметром идет необязательный Boolean, который в случае true делает сортировку по
- //возрастанию, в случае false - по убыванию.По умолчанию(без третьего параметра) происходит сортировка по возрастанию.
- const persons = [
- { name: 'Canvas', age: 17 },
- { name: 'Bogdan', age: 35 },
- { name: 'Anton', age: 73 },
- { name: 'Dango', age: 120 },
- ];
- const sort = (arr, sortBy, flag = true) => {
- const sorted = [
- ...arr.sort(function (a, b) {
- if (a[sortBy] < b[sortBy]) {
- return -1;
- } else if (a[sortBy] > b[sortBy]) {
- return 1;
- }
- return 0;
- }),
- ];
- return flag ? sorted : sorted.reverse();
- };
- console.log(sort(persons, 'age')); //sort increase by age
- console.log(sort(persons, 'age', false)); //decrease sort increase by age
- console.log(sort(persons, 'name')); //sort increase by name
- console.log(sort(persons, 'name', false)); //decrease sort increase by name
- //array map
- //Используя Array.map приведите все строки в массиве к числу. Элементы других типов оставьте как есть:
- //должно превратиться в
- //[1, {}, null, undefined, 500, 700]
- const arrValues = ['1', {}, null, undefined, '500', 700];
- const rightArray = arrValues.map((el) => {
- console.log(isNaN(el));
- if (typeof el === 'string') return Number(el);
- return el;
- });
- console.log(rightArray);
- //array reduce
- //Получите произведение всех чисел в массиве, используя Array.reduce. Не обрабатывайте типы данных, не являющиеся числом.
- //результат должен быть 15
- const arrForReduce = ['0', 5, 3, 'string', null];
- const amountOfNumbers = arrForReduce.reduce((acc, el) => {
- if (typeof el === 'number') return (acc *= el);
- return acc;
- }, 1);
- console.log(amountOfNumbers);
- //object filter
- //Напишите свою реализацию Array.filter для объектов:
- //должно вернуть
- // {
- // ram: 2,
- // color: "black",
- // }
- //Для удаления пары ключ-значение используйте delete. Или сделайте копию объекта.
- const phone = {
- brand: 'meizu',
- model: 'm2',
- ram: 2,
- color: 'black',
- };
- function objectFilter(arr, f) {
- const result = {};
- for (const [key, value] of Object.entries(arr)) {
- if (f(key, value)) result[key] = value;
- }
- return result;
- }
- console.log(
- objectFilter(phone, (key, value) => key === 'color' || value === 2)
- );
- //object map
- //Напишите свою реализацию Array.map для объектов:
- // map({name: "Иван", age: 17},function(key,value){
- // var result = {};
- // result[key+"_"] = value + "$";
- // return result;
- // }) //должен вернуть {name_: "Иван$", age_: "17$"}
- //"Напишите свою реализацию" значит написать function map.... и её тело, после чего код выше заработает
- const mapObjects = (obj, cb) => {
- const result = {};
- for (const key in obj) {
- if (cb(key, obj[key])) result[key + '_'] = obj[key] + '$';
- }
- return result;
- };
- const object = { name: 'Hryhorii', age: 24 };
- console.log(
- mapObjects(object, (key, value) => (key === 'name') | (value === 'Hryhorii'))
- );
- //Рекурсия
- //Sum
- //Напишите функцию, который будет считать сумму арифметической прогрессии рекурсивно.
- const sumRecursion = (n) => {
- if (n === 1) return 1;
- return n + sumRecursion(n - 1);
- };
- console.log(sumRecursion(5)); // recursion
- //HTML Tree
- //Сделать задание на синий пояс, используя рекурсию, без ограничения вложенности.
- const htmlConstructor = (htmlObj, previousHtml) => {
- if (htmlObj.children === undefined) return previousHtml;
- if (previousHtml === undefined) {
- return htmlConstructor(htmlObj, document.createElement(htmlObj.tagName));
- }
- htmlObj.children.forEach((innerObj, i) => {
- const { tagName, text, attrs } = innerObj;
- const tag = document.createElement(tagName);
- tag.textContent = text;
- for (const atr in attrs) {
- tag.setAttribute(atr, attrs[atr]);
- }
- previousHtml.append(tag);
- return htmlConstructor(innerObj, previousHtml.children[i]);
- });
- return previousHtml;
- };
- document.body.prepend(htmlConstructor(htmlObj));
|