js_hw09_functions_2.js 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483
  1. // // ES6
  2. // // Переделайте предыдущее ДЗ используя максимум возможностей ES6. Отметьте облегчение (или утяжеление) синтаксиса.
  3. // // различия:;
  4. function difference() {
  5. // // --- Block scope variables
  6. // // В ES6 мы перешли от var к let/const.
  7. // // блоки кода и видимость только внутри блока кода для let
  8. // // ---- Multi-line strings
  9. // // ---- Destructuring Assignment -----;
  10. // ES5;
  11. // var array = [1, 2, 3, 4];
  12. // var first = array[0];
  13. // var third = array[2];
  14. // ES6;
  15. // const array = [1, 2, 3, 4];
  16. // const [first, , third] = array;
  17. // ES6; //обмен значениями
  18. // let a = 1;
  19. // let b = 2;
  20. // [a, b] = [b, a];
  21. // ES5;
  22. // function margin() {
  23. // var left = 1,
  24. // right = 2,
  25. // top = 3,
  26. // bottom = 4;
  27. // return { left: left, right: right, top: top, bottom: bottom };
  28. // ----// или ES6 - return [left, right, top, bottom]; но вызывающему коду придется знать о порядке данных.
  29. // }
  30. // ES6;
  31. // const user = { firstName: "Adrian", lastName: "Mejia" };
  32. // function getFullName({ firstName, lastName }) {
  33. // // и деструктуризация
  34. // return `${firstName} ${lastName}`; // и `${ }`
  35. // }
  36. // // ------- Глубокое сопоставление
  37. // ES5;
  38. // function settings() {
  39. // return { display: { color: "red" }, keyboard: { layout: "querty" } };
  40. // }
  41. // var tmp = settings();
  42. // var displayColor = tmp.display.color;
  43. // var keyboardLayout = tmp.keyboard.layout;
  44. // console.log(displayColor, keyboardLayout); // red querty
  45. // ES6;
  46. // function settings() {
  47. // return { display: { color: "red" }, keyboard: { layout: "querty" } };
  48. // }
  49. // const {
  50. // display: { color: displayColor },
  51. // keyboard: { layout: keyboardLayout },
  52. // } = settings();
  53. // console.log(displayColor, keyboardLayout); // red querty
  54. // // Это также называют деструктуризацией объекта (object destructing).
  55. // // --------------- Классы и объекты ------------------------
  56. // В ECMAScript 6 мы перешли от “функций-конструкторов” к “классам” .
  57. // // Каждый объект в JavaScript имеет прототип, который является другим объектом.
  58. // // Все объекты в JavaScript наследуют методы и свойства от своего прототипа.
  59. // // В ES5 объектно - ориентированное программирование достигалось с помощью функций - конструкторов.
  60. // // Они создавали объекты следующим образом:
  61. // ES5
  62. // var Animal = (function () {
  63. // function MyConstructor(name) {
  64. // this.name = name;
  65. // }
  66. // MyConstructor.prototype.speak = function speak() {
  67. // console.log(this.name + ' makes a noise.');
  68. // };
  69. // return MyConstructor;
  70. // })();
  71. // var animal = new Animal('animal');
  72. // animal.speak(); // animal makes a noise.
  73. // // В ES6 есть новый синтаксический сахар.
  74. // // Можно сделать то же самое с меньшим кодом и с использованием ключевых слов class и construсtor.
  75. // // Также заметьте, как четко определяются методы: construсtor.prototype.speak = function () vs speak():
  76. // ES6
  77. // class Animal {
  78. // constructor(name) {
  79. // this.name = name;
  80. // }
  81. // speak() {
  82. // console.log(this.name + ' makes a noise.');
  83. // }
  84. // }
  85. // const animal = new Animal('animal');
  86. // animal.speak(); // animal makes a noise.
  87. // // ++ наследование
  88. // ES6
  89. // class Lion extends Animal {
  90. // speak() {
  91. // super.speak();
  92. // console.log(this.name + ' roars ');
  93. // }
  94. // }
  95. // const lion = new Lion('Simba');
  96. // lion.speak(); // Simba makes a noise.
  97. // // Simba roars.
  98. // // ---------- Нативные промисы -------- вот тут я пока не понял, поэтому пока не заношу сюда
  99. // //
  100. // // ----- Стрелочные функции ------------ а тут как раз все понятно (как мне кажется) => тоже не заношу
  101. // //
  102. // // ----- FOR OF -------------- разве он не был всегда в JS ?????? (:шок:)
  103. // //
  104. // // ----- Параметры по умолчанию ----------------------
  105. // ES5;
  106. // function point(x, y, isFlag) {
  107. // x = x || 0;
  108. // y = y || -1;
  109. // isFlag = isFlag || true;
  110. // console.log(x, y, isFlag);
  111. // }
  112. // //
  113. // // ----- Rest-параметры ----------------------
  114. // ES6;
  115. // function printf(format, ...params) {
  116. // console.log("params: ", params);
  117. // console.log("format: ", format);
  118. // }
  119. // printf("%s %d %.2f", "adrian", 321, Math.PI);
  120. // //
  121. // // ----- Операция Spread ----------------------
  122. // ES6
  123. // Math.max(...[2,100,1,6,43]) // 100
  124. // // ----------Мы также перешли от concat к spread'у: -----------
  125. // ES5
  126. // var array1 = [2,100,1,6,43];
  127. // var array2 = ['a', 'b', 'c', 'd'];
  128. // var array3 = [false, true, null, undefined];
  129. // console.log(array1.concat(array2, array3));
  130. // ES6
  131. // const array1 = [2,100,1,6,43];
  132. // const array2 = ['a', 'b', 'c', 'd'];
  133. // const array3 = [false, true, null, undefined];
  134. // console.log([...array1, ...array2, ...array3]);
  135. }
  136. // //
  137. // // ------------ Это только базовые возможности, о которых должен знать каждый разработчик ------------
  138. // //
  139. // // ----------- http://kangax.github.io/compat-table/es6/ --------------------------
  140. // //
  141. // //
  142. // //
  143. // a
  144. // Напишите функцию a, которая просто является коротким именем для alert.
  145. // интересно, а такой вариант решения прокатит?:
  146. const a = alert;
  147. // The End.
  148. // если нет, то вот код из предыдущего ДЗ
  149. // const a = function (message) {
  150. // alert(message);
  151. // }
  152. // ----------------------------------------------------------
  153. // cube
  154. // Напишите функцию cube, которая возвращает число в третьей степени:
  155. const cube = function (toCube = 0) {
  156. return Math.pow(toCube, 3);
  157. };
  158. // ----------------------------------------------------------
  159. // avg2
  160. // Напишите функцию avg2, которая рассчитывает среднюю для двух чисел:
  161. // Если без заморочек, то:
  162. // const avg2 = (a = 0, b = 0) => (a + b) / 2;
  163. // среднее арифметическое для любого количества аргументов
  164. const avg2 = function (...argArr) {
  165. if (!argArr.length) return 0;
  166. return argArr.reduce((a, b) => a + b) / argArr.length;
  167. };
  168. // ----------------------------------------------------------
  169. // sum3
  170. // Напишите функцию sum3 для суммирования 3 чисел:
  171. // Обратите внимание, что sum3 от двух параметров тоже работает корректно.
  172. const arrSum = function (arr) {
  173. let sum = 0;
  174. for (item of arr) sum += item;
  175. return sum;
  176. };
  177. // ----------------------------------------------------------
  178. // intRandom
  179. // Напишите функцию intRandom, которая принимает два параметра: нижнюю и верхнюю границу,
  180. // и возвращает целое случайное число из этого диапазона включительно:
  181. // Обратите внимание, что если передан один параметр (intRandom(10) в примере выше),
  182. // то функция работает как будто первый параметр равен 0,
  183. // а переданный параметр становится вторым параметром(intRandom(0, 10))
  184. // Используйте умножение для расширения значения встроенной функции Math.random c диапозона 1,
  185. // сложениe для смещения результата на первый параметр, и Math.round для округления результата
  186. const intRandom = function (min = 1, max = 0) {
  187. return min + Math.round(Math.random() * (max - min));
  188. };
  189. // ----------------------------------------------------------
  190. // greetAll
  191. // Сделайтей функцию, которая приветствует всех, кто передан в качестве параметров.
  192. // Вам поможет arguments и for
  193. const greetAll = function greetAll() {
  194. let arr = [...arguments];
  195. let all = arr.join(", ");
  196. if (all) {
  197. console.log(`Hi, ${all}!`);
  198. alert(`Hi, ${all}!`);
  199. }
  200. };
  201. // ----------------------------------------------------------
  202. // sum
  203. // Напишите функцию sum, которая сумирует любое количество параметров:
  204. // Используйте псевдомассив arguments для получения всех параметров,
  205. // и for для итерирования по нему
  206. const sum = function () {
  207. var total = 0;
  208. for (let item of arguments) {
  209. if (!isNaN(item)) total += +item;
  210. }
  211. return total;
  212. };
  213. // ----------------------------------------------------------
  214. // sort
  215. // Сделайте обобщенную функцию сортировки массива
  216. var persons = [
  217. { name: "Иван", age: 17 },
  218. { name: "Мария", age: 35 },
  219. { name: "Алексей", age: 73 },
  220. { name: "Яков", age: 12 },
  221. ];
  222. sort = function (arr, key = undefined, direction = true) {
  223. if (direction) {
  224. arr.sort(function (a, b) {
  225. if (a[key] > b[key]) return 1;
  226. if (a[key] < b[key]) return -1;
  227. return 0;
  228. });
  229. } else
  230. arr.sort(function (a, b) {
  231. if (a[key] < b[key]) return 1;
  232. if (a[key] > b[key]) return -1;
  233. return 0;
  234. });
  235. return arr;
  236. };
  237. // sort(persons, "age"); //сортирует по возрасту по возрастанию
  238. // sort(persons, "name", false); //сортирует по имени по убыванию
  239. // ----------------------------------------------------------
  240. // array map
  241. // Используя Array.map приведите все строки в массиве к числу.
  242. // Элементы других типов оставьте как есть:
  243. // ["1", {}, null, undefined, "500", 700]
  244. // должно превратиться в
  245. // [1, {}, null, undefined, 500, 700]
  246. let arr = ["1", {}, null, undefined, "500", 700].map((item) => parseInt(item, 10) || item); // - эта штука все же неверно сработает со строкой "0"
  247. ["0kijuib", "000", {}, null, undefined, "500", 700].map((item) => {
  248. if (typeof item == "string") return isNaN(parseInt(item, 10)) ? item : parseInt(item, 10);
  249. return item;
  250. });
  251. // ----------------------------------------------------------
  252. // array reduce
  253. // Получите произведение всех чисел в массиве, используя Array.reduce.
  254. // Не обрабатывайте типы данных, не являющиеся числом.
  255. // ["0", 5, 3, "string", null]
  256. // резуль?тат должен быть 15
  257. let composition = ["0", 5, 3, "string", null].reduce((a, b) => (typeof b == "number" ? a * b : a), 1);
  258. // ----------------------------------------------------------
  259. // object filter
  260. // Напишите свою реализацию Array.filter для объектов:
  261. // filter(phone,(key,value) => key == "color" || value == 2);
  262. // должно вернуть
  263. // {
  264. // ram: 2,
  265. // color: "black",
  266. // }
  267. // Для удаления пары ключ - значение используйте delete.Или сделайте копию объекта.
  268. let phone = {
  269. brand: "meizu",
  270. model: "m2",
  271. ram: 2,
  272. color: "black",
  273. };
  274. // возвращает измененую ПОВЕРХНОСТНУЮ копию
  275. function filterCopy(obj, func) {
  276. let objCopy = Object.assign({}, obj);
  277. for (let [key, value] of Object.entries(objCopy)) {
  278. if (!func(key, value)) delete objCopy[key];
  279. }
  280. return objCopy;
  281. }
  282. let phoneNew = filterCopy(phone, (key, value) => key == "color" || value == 2);
  283. // меняет существующий объект
  284. function filter(obj, func) {
  285. for (let [key, value] of Object.entries(obj)) {
  286. if (!func(key, value)) delete obj[key];
  287. }
  288. }
  289. filter(phone, (key, value) => key == "color" || value == 2);
  290. // ----------------------------------------------------------
  291. // object map
  292. // Напишите свою реализацию Array.map для объектов:
  293. // map({ name: "Иван", age: 17 }, function (key, value) {
  294. // var result = {};
  295. // result[key + "_"] = value + "$";
  296. // return result;
  297. // }); //должен вернуть {name_: "Иван$", age_: "17$"}
  298. const map = function (obj, func) {
  299. let objNew = {};
  300. for (let key in obj) {
  301. objNew = { ...objNew, ...func(key, obj[key]) };
  302. }
  303. return objNew;
  304. };
  305. let testObj = map({ name: "Иван", age: 17 }, function (key, value) {
  306. var result = {};
  307. result[key + "_"] = value + "$";
  308. return result;
  309. });
  310. // ----------------------------------------------------------
  311. // Рекурсия
  312. // Sum
  313. // Напишите функцию, который будет считать сумму арифметической прогрессии рекурсивно.
  314. // В качестве параметров передаем 1-й элемент прогрессии, инкремент
  315. // и сколько всего элементов прогрессии должны быть просуммировано (включая первый)
  316. const sum = function (startValue, inc, numberOfElements) {
  317. if (numberOfElements < 1) return 0;
  318. if (numberOfElements === 1) return startValue;
  319. return startValue + sum(startValue + inc, inc, numberOfElements - 1);
  320. };
  321. // вариант 2
  322. // здесь передаем 1-й элемент прогрессии, инкремент
  323. // и не больше какого числа должен быть последний элемент
  324. const sum2 = function (startValue, inc, maxValue) {
  325. if (startValue + inc > maxValue) return startValue;
  326. return startValue + sum2(startValue + inc, inc, maxValue);
  327. };
  328. // ----------------------------------------------------------
  329. // HTML Tree
  330. // Сделать задание на синий пояс, используя рекурсию, без ограничения вложенности.
  331. // сделано еще в прошлый раз
  332. let someTree = {
  333. tagName: "table", //html tag
  334. subTags: [
  335. //вложенные тэги
  336. {
  337. tagName: "tr",
  338. subTags: [
  339. {
  340. tagName: "td",
  341. text: "some text",
  342. },
  343. {
  344. tagName: "td",
  345. text: "some text 2",
  346. attrs: {
  347. bgcolor: "red",
  348. },
  349. },
  350. {
  351. tagName: "th",
  352. text: "some text right1",
  353. attrs: {
  354. bgcolor: "gray",
  355. },
  356. },
  357. ],
  358. },
  359. {
  360. tagName: "tr",
  361. subTags: [
  362. {
  363. tagName: "td",
  364. text: "some text 3",
  365. },
  366. {
  367. tagName: "td",
  368. text: "some text 4",
  369. },
  370. {
  371. tagName: "td",
  372. text: "some text right 2",
  373. },
  374. ],
  375. attrs: {
  376. bgcolor: "#42ecff",
  377. },
  378. },
  379. {
  380. tagName: "tr",
  381. subTags: [
  382. {
  383. tagName: "td",
  384. text: "some text 5",
  385. },
  386. {
  387. tagName: "td",
  388. text: "some text 6",
  389. },
  390. {
  391. tagName: "td",
  392. text: "some text right 3",
  393. },
  394. ],
  395. attrs: {
  396. bgcolor: "#00FF00",
  397. },
  398. },
  399. ],
  400. attrs: {
  401. border: 1,
  402. align: "center",
  403. },
  404. };
  405. // функция для конструкции таблиц (и не только таблиц)
  406. // с любым числом колонок и строк
  407. // с любым набором атрибутов
  408. const сonstructor = function (item) {
  409. let node = document.createElement(item.tagName);
  410. if ("attrs" in item) {
  411. for (attrKey in item.attrs) {
  412. node.setAttribute(attrKey, item.attrs[attrKey]);
  413. }
  414. }
  415. if ("subTags" in item) {
  416. for (i in item.subTags) {
  417. node.append(сonstructor(item.subTags[i]));
  418. }
  419. }
  420. if ("text" in item) {
  421. node.innerText = item.text;
  422. }
  423. return node;
  424. };
  425. document.body.append(сonstructor(someTree));