hw.js 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. 'use strict';
  2. import htmlObj from './someTree.js';
  3. //Домашнее задание. Функции 2, ES6
  4. //Переделайте предыдущее ДЗ используя максимум возможностей ES6. Отметьте облегчение (или утяжеление) синтаксиса.
  5. // Easier: used loop forEach on row 34 ,and arrow function on row 60
  6. // Harder : We cant totally replace simple loop from ES5 because it's not suit to use ES6 for already counted iterations
  7. const table = document.createElement('table');
  8. for (let i = 0; i < 10; i++) {
  9. const tr = document.createElement('tr');
  10. for (let j = 1; j < 11; j++) {
  11. const td = document.createElement('td');
  12. td.id = String(i) + String(j);
  13. td.dataset.col = String(i);
  14. if (j === 10) {
  15. td.textContent = String(i);
  16. tr.prepend(td);
  17. continue;
  18. }
  19. td.textContent = String((i === 0 ? 1 : i) * j);
  20. tr.append(td);
  21. }
  22. table.append(tr);
  23. }
  24. document.body.append(table);
  25. table.onmouseover = function ({
  26. target: {
  27. cellIndex,
  28. tagName,
  29. id,
  30. dataset: { col },
  31. },
  32. }) {
  33. this.childNodes.forEach((element) => {
  34. element.childNodes.forEach((td) => {
  35. if (td.cellIndex === cellIndex) {
  36. td.style.backgroundColor = 'yellow';
  37. } else if (td.dataset.col === col) {
  38. td.style.backgroundColor = 'orange';
  39. } else {
  40. td.style.backgroundColor = 'grey';
  41. }
  42. });
  43. });
  44. if (tagName === 'TD')
  45. document.getElementById(id).style.backgroundColor = 'green';
  46. };
  47. //Calc
  48. const btnSubmit = document.getElementById('submitCalc');
  49. const resultP = document.getElementById('result');
  50. btnSubmit.addEventListener('click', updateValue);
  51. function updateValue(e) {
  52. const values = e.target.parentNode.children;
  53. resultP.textContent = String(+values[0].value * +values[1].value);
  54. }
  55. //Calc Live
  56. const firstInput = document.getElementById('first');
  57. const secondInput = document.getElementById('second');
  58. const handelInputs = (e, inputValue) => {
  59. resultP.textContent = String(+e.target.value * +inputValue.value);
  60. };
  61. firstInput.addEventListener('change', (e) => handelInputs(e, secondInput));
  62. secondInput.addEventListener('change', (e) => handelInputs(e, firstInput));
  63. //sort
  64. //Сделайте обобщенную функцию сортировки массива
  65. //Функция позволяет отсортировать любой набор данных по имени поля (второй параметр).
  66. //Третьим параметром идет необязательный Boolean, который в случае true делает сортировку по
  67. //возрастанию, в случае false - по убыванию.По умолчанию(без третьего параметра) происходит сортировка по возрастанию.
  68. const persons = [
  69. { name: 'Canvas', age: 17 },
  70. { name: 'Bogdan', age: 35 },
  71. { name: 'Anton', age: 73 },
  72. { name: 'Dango', age: 120 },
  73. ];
  74. const sort = (arr, sortBy, flag = true) => {
  75. const sorted = [
  76. ...arr.sort(function (a, b) {
  77. if (a[sortBy] < b[sortBy]) {
  78. return -1;
  79. } else if (a[sortBy] > b[sortBy]) {
  80. return 1;
  81. }
  82. return 0;
  83. }),
  84. ];
  85. return flag ? sorted : sorted.reverse();
  86. };
  87. console.log(sort(persons, 'age')); //sort increase by age
  88. console.log(sort(persons, 'age', false)); //decrease sort increase by age
  89. console.log(sort(persons, 'name')); //sort increase by name
  90. console.log(sort(persons, 'name', false)); //decrease sort increase by name
  91. //array map
  92. //Используя Array.map приведите все строки в массиве к числу. Элементы других типов оставьте как есть:
  93. //должно превратиться в
  94. //[1, {}, null, undefined, 500, 700]
  95. const arrValues = ['1', {}, null, undefined, '500', 700];
  96. const rightArray = arrValues.map((el) => {
  97. console.log(isNaN(el));
  98. if (typeof el === 'string') return Number(el);
  99. return el;
  100. });
  101. console.log(rightArray);
  102. //array reduce
  103. //Получите произведение всех чисел в массиве, используя Array.reduce. Не обрабатывайте типы данных, не являющиеся числом.
  104. //результат должен быть 15
  105. const arrForReduce = ['0', 5, 3, 'string', null];
  106. const amountOfNumbers = arrForReduce.reduce((acc, el) => {
  107. if (typeof el === 'number') return (acc *= el);
  108. return acc;
  109. }, 1);
  110. console.log(amountOfNumbers);
  111. //object filter
  112. //Напишите свою реализацию Array.filter для объектов:
  113. //должно вернуть
  114. // {
  115. // ram: 2,
  116. // color: "black",
  117. // }
  118. //Для удаления пары ключ-значение используйте delete. Или сделайте копию объекта.
  119. const phone = {
  120. brand: 'meizu',
  121. model: 'm2',
  122. ram: 2,
  123. color: 'black',
  124. };
  125. function objectFilter(arr, f) {
  126. const result = {};
  127. for (const [key, value] of Object.entries(arr)) {
  128. if (f(key, value)) result[key] = value;
  129. }
  130. return result;
  131. }
  132. console.log(
  133. objectFilter(phone, (key, value) => key === 'color' || value === 2)
  134. );
  135. //object map
  136. //Напишите свою реализацию Array.map для объектов:
  137. // map({name: "Иван", age: 17},function(key,value){
  138. // var result = {};
  139. // result[key+"_"] = value + "$";
  140. // return result;
  141. // }) //должен вернуть {name_: "Иван$", age_: "17$"}
  142. //"Напишите свою реализацию" значит написать function map.... и её тело, после чего код выше заработает
  143. const mapObjects = (obj, cb) => {
  144. const result = {};
  145. for (const key in obj) {
  146. if (cb(key, obj[key])) result[key + '_'] = obj[key] + '$';
  147. }
  148. return result;
  149. };
  150. const object = { name: 'Hryhorii', age: 24 };
  151. console.log(
  152. mapObjects(object, (key, value) => (key === 'name') | (value === 'Hryhorii'))
  153. );
  154. //Рекурсия
  155. //Sum
  156. //Напишите функцию, который будет считать сумму арифметической прогрессии рекурсивно.
  157. const sumRecursion = (n) => {
  158. if (n === 1) return 1;
  159. return n + sumRecursion(n - 1);
  160. };
  161. console.log(sumRecursion(5)); // recursion
  162. //HTML Tree
  163. //Сделать задание на синий пояс, используя рекурсию, без ограничения вложенности.
  164. const htmlConstructor = (htmlObj, previousHtml) => {
  165. if (htmlObj.children === undefined) return previousHtml;
  166. if (previousHtml === undefined) {
  167. return htmlConstructor(htmlObj, document.createElement(htmlObj.tagName));
  168. }
  169. htmlObj.children.forEach((innerObj, i) => {
  170. const { tagName, text, attrs } = innerObj;
  171. const tag = document.createElement(tagName);
  172. tag.textContent = text;
  173. for (const atr in attrs) {
  174. tag.setAttribute(atr, attrs[atr]);
  175. }
  176. previousHtml.append(tag);
  177. return htmlConstructor(innerObj, previousHtml.children[i]);
  178. });
  179. return previousHtml;
  180. };
  181. document.body.prepend(htmlConstructor(htmlObj));