script.js 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583
  1. // Arrow to Functions
  2. // Переведите любые пять заданий из предыдущего ДЗ по функциям в синтаксис function
  3. arrow_to_functions: {
  4. function rgb(r, g, b) {
  5. let color = '#' + (r > 15 ? r.toString(16) : '0' + r.toString(16)) +
  6. (g > 15 ? g.toString(16) : '0' + g.toString(16)) +
  7. (b > 15 ? b.toString(16) : '0' + b.toString(16));
  8. return color;
  9. }
  10. console.log(rgb(5, 5, 5));
  11. console.log(rgb(13, 35, 456));
  12. function apartmentSearch(numberOfFloors, numberOfApartmentsOnFloor, apartmentNumber) {
  13. let apartmentLocation = {
  14. entrance: null,
  15. floor: null,
  16. }
  17. apartmentLocation.entrance = Math.ceil(apartmentNumber / (numberOfFloors * numberOfApartmentsOnFloor));
  18. apartmentLocation.floor = Math.ceil(apartmentNumber % (numberOfFloors * numberOfApartmentsOnFloor) /
  19. numberOfApartmentsOnFloor) || numberOfFloors;
  20. return apartmentLocation;
  21. }
  22. console.log(apartmentSearch(9, 4, 81));
  23. function capitalize(str) {
  24. let result = str.trim().slice(0, 1).toUpperCase() + str.trim().slice(1).toLowerCase();
  25. return result;
  26. }
  27. function credentials() {
  28. let person = {}
  29. person.name = capitalize(prompt('What is your name?'));
  30. person.surname = capitalize(prompt('What is your surname?'));
  31. person.fatherName = capitalize(prompt('What is your middle name?'));
  32. person.fullName = person.surname + ' ' + person.name + ' ' + person.fatherName;
  33. return person;
  34. }
  35. credentials();
  36. function newLine(str) {
  37. let result = str.split('\\n').join('\n');
  38. return result;
  39. }
  40. alert(newLine(prompt("Enter the string. As a newline marker use '\\n'")));
  41. function promptOr(str, defaultValue) {
  42. prompt(str) || defaultValue;
  43. }
  44. alert(promptOr('Enter something', 'error'));
  45. }
  46. // createPerson
  47. // Создайте функцию createPerson, которая принимает два параметра: name и surname, и возвращает объект с
  48. // ключами name, surname, getFullName. getFullName должна быть функцией, которая работает с объектом через this,
  49. // а так же готова к тому, что в объекте в последствии добавить ключ fatherName
  50. create_person: {
  51. function createPerson(name, surname) {
  52. let obj = {
  53. name,
  54. surname,
  55. getFullName() {
  56. let fullName = this.fatherName ? this.name + ' ' + this.fatherName + ' ' + this.surname
  57. : this.name + ' ' + this.surname;
  58. return fullName;
  59. },
  60. }
  61. return obj;
  62. }
  63. const a = createPerson("Вася", "Пупкин")
  64. const b = createPerson("Анна", "Иванова")
  65. const c = createPerson("Елизавета", "Петрова")
  66. a.fatherName = 'Иванович' //Вася Иванович Пупкин
  67. console.log(a.getFullName()) //Вася Пупкин
  68. console.log(b.getFullName()) //Анна Иванова
  69. }
  70. // createPersonClosure
  71. // Задание в целом, аналогично предыдущему, однако, в объект заносить name, surname, fatherName и age не нужно.
  72. // name и surname должны быть параметрами, переменные age и fatherName объявите через let в теле
  73. // createPersonClosure. Внутри createPersonClosure объявите следующие функции:
  74. // getName
  75. // getSurname
  76. // getFatherName
  77. // getAge
  78. // getFullName
  79. // Эти функции должны возвращать переменные, объявленные в функции createPersonClosure
  80. // Следующие функции:
  81. // setName
  82. // setSurname
  83. // setFatherName
  84. // setAge
  85. // setFullName
  86. // должны принимать один параметр (newName, newSurname и т.п.), проверять его на корректность и менять значение
  87. // переменных, объявленных внутри createPersonClosure.Проверки на корректность:
  88. // имя, фамилия, отчество должно быть строкой с большой буквы
  89. // возраст должен быть числом от 0 до 100.
  90. // Если проверка на корректность не пройдена, функция не должна менять соответстующую переменную.
  91. // Функция setFullName должна разбивать строку по пробелам и заносить части строки в surname, name и fatherName
  92. // Все функции set должны возвращать то значение, которое по итогу попало во внутренюю переменную. То есть если
  93. // новое значение некорректно, то функция возвращает старое значение
  94. // В объекте-результате createPersonClosure должны быть только эти 10 функций (геттеров и сеттеров). В коде
  95. // функций this не используется
  96. create_person_closure: {
  97. function createPersonClosure(name, surname) {
  98. let age;
  99. let fatherName;
  100. let obj = {
  101. getName() {
  102. return name;
  103. },
  104. getSurname() {
  105. return surname;
  106. },
  107. getFatherName() {
  108. return fatherName;
  109. },
  110. getAge() {
  111. return age;
  112. },
  113. getFullName() {
  114. return surname + ' ' + name + ' ' + fatherName;
  115. },
  116. setName(newName) {
  117. if (validateName(newName)) {
  118. name = newName;
  119. } else {
  120. alert('ERROR. You need write string with big first letter');
  121. }
  122. },
  123. setSurname(newSurname) {
  124. if (validateName(newSurname)) {
  125. surname = newSurname;
  126. } else {
  127. alert('ERROR. You need write string with big first letter');
  128. }
  129. },
  130. setFatherName(newFatherName) {
  131. if (validateName(newFatherName)) {
  132. fatherName = newFatherName;
  133. } else {
  134. alert('ERROR. You need write string with big first letter');
  135. }
  136. },
  137. setFullName(str) {
  138. surname = str.split(' ')[0];
  139. name = str.split(' ')[1];
  140. fatherName = str.split(' ')[2];
  141. },
  142. setAge(newAge) {
  143. if (newAge >= 0 && newAge <= 100 || newAge == '') {
  144. age = newAge;
  145. } else {
  146. alert('ERROR');
  147. }
  148. },
  149. }
  150. function validateName(name) {
  151. return name.charCodeAt(0) >= 65 && name.charCodeAt(0) <= 90 ||
  152. name.charCodeAt(0) >= 1040 && name.charCodeAt(0) <= 1071 || name == '';
  153. }
  154. return obj;
  155. }
  156. const a = createPersonClosure("Вася", "Пупкин");
  157. const b = createPersonClosure("Анна", "Иванова");
  158. console.log(a.getName());
  159. console.log(a.setAge(15));
  160. //a.setAge(150); //не работает
  161. a.setSurname('Варченко');
  162. a.setFatherName('Александрович');
  163. console.log(a.getSurname());
  164. console.log(a.getFullName());
  165. b.setFullName("Петрова Анна Николаевна");
  166. console.log(b.getFatherName()); //Николаевна
  167. }
  168. // createPersonClosureDestruct
  169. // Сделайте набор параметров функции из предыдущего задания объектом, используйте деструктуризацию для
  170. // извлечения параметров.
  171. // Задайте значения по умолчанию
  172. create_person_closure_destruct: {
  173. function createPersonClosureDestruct(object) {
  174. let { name = '', surname = '', fatherName = '', age = 0 } = object;
  175. let obj = {
  176. getName() {
  177. return name;
  178. },
  179. getSurname() {
  180. return surname;
  181. },
  182. getFatherName() {
  183. return fatherName;
  184. },
  185. getAge() {
  186. return age;
  187. },
  188. getFullName() {
  189. return surname + ' ' + name + ' ' + fatherName;
  190. },
  191. setName(newName) {
  192. if (validateName(newName)) {
  193. name = newName;
  194. } else {
  195. alert('ERROR. You need write string with big first letter');
  196. }
  197. },
  198. setSurname(newSurname) {
  199. if (validateName(newSurname)) {
  200. surname = newSurname;
  201. } else {
  202. alert('ERROR. You need write string with big first letter');
  203. }
  204. },
  205. setFatherName(newFatherName) {
  206. if (validateName(newFatherName)) {
  207. fatherName = newFatherName;
  208. } else {
  209. alert('ERROR. You need write string with big first letter');
  210. }
  211. },
  212. setFullName(str) {
  213. surname = str.split(' ')[0];
  214. name = str.split(' ')[1];
  215. fatherName = str.split(' ')[2];
  216. },
  217. setAge(newAge) {
  218. if (newAge >= 0 && newAge <= 100 || newAge == '') {
  219. age = newAge;
  220. } else {
  221. alert('ERROR');
  222. }
  223. },
  224. }
  225. function validateName(name) {
  226. return name.charCodeAt(0) >= 65 && name.charCodeAt(0) <= 90 ||
  227. name.charCodeAt(0) >= 1040 && name.charCodeAt(0) <= 1071 || name == '';
  228. }
  229. return obj;
  230. }
  231. function createPerson(name, surname) {
  232. let obj = {
  233. name,
  234. surname,
  235. getFullName() {
  236. let fullName = this.fatherName ? this.name + ' ' + this.fatherName + ' ' + this.surname
  237. : this.name + ' ' + this.surname;
  238. return fullName;
  239. },
  240. }
  241. return obj;
  242. }
  243. const a = createPersonClosureDestruct(createPerson("Вася Пупкин")); // в самом задании выше нам было сказано записать в createPerson 2 параметра, тут же передается строка. Соответсвенно нужно либо переписать функцию createPerson, чтобы она разбивала строку, либо передавать через запятую имя и фамилию
  244. const b = createPersonClosureDestruct({ name: 'Николай', age: 75 });
  245. console.log(a.getName());
  246. console.log(a.getAge());
  247. console.log(b.getSurname());
  248. }
  249. // isSorted
  250. // Напишите функцию isSorted, которая принимает набор параметров любого размера, и возвращает true, когда все
  251. // параметры - это числа, и каждое из них больше предыдущего параметра.
  252. is_sorted: {
  253. function isSorted(...params) {
  254. let result = true;
  255. for (let i = 0; i < params.length; i++) {
  256. if (typeof params[i] != 'number' || params[i] > params[i + 1] && params[i + 1] != undefined) {
  257. result = false;
  258. }
  259. }
  260. return result;
  261. }
  262. console.log(isSorted(1, 0, 3, 56, 234, 56, 2, 8, 76));
  263. console.log(isSorted(1, 2, 3, 5));
  264. console.log(isSorted(1, 'jrfnejrkfn', 3, 4, 5));
  265. console.log(isSorted(1));
  266. }
  267. // Test isSorted
  268. // Используя циклический ввод в массив (задание array fill), обеспечьте ввод данных для isSorted
  269. test_is_sorted: {
  270. let arr = [];
  271. let answer;
  272. while (answer = prompt('Enter something')) {
  273. arr.push(+answer);
  274. }
  275. function isSorted(arr) {
  276. console.log(arr);
  277. let result = true;
  278. for (let i = 0; i < arr.length; i++) {
  279. if (typeof arr[i] != 'number' || arr[i] > arr[i + 1] && arr[i + 1] != undefined) {
  280. result = false;
  281. }
  282. }
  283. return result;
  284. }
  285. console.log(isSorted(arr));
  286. }
  287. // personForm
  288. // Напишите функцию, которая принимает два параметра: родительский DOM-элемент и объект-результат работы
  289. // createPersonClosure (или createPersonClosureDestruct, результаты у обоих этих функций одинаковые) и рисует
  290. // форму, которая позволяет редактировать данные о персоне.
  291. // В начале работы personForm создает 5 полей ввода (имя, фамилия, отчество, возраст, ФИО) в родительском
  292. // DOM-элементе и устанавливает туда значения, прочитанные с помощью getName, getSurname и т.д.
  293. // По событию oninput в любом из полей ввода нужно запускать соответствующий set..... Например при изменении
  294. // поля ввода имени должен запускаться setName(какой-то инпут.value). Функции set... возвращают значение, и
  295. // его нужно занести обратно в input. Таким образом в полях ввода невозможно будет ввести некорректные значения
  296. // (например возраст не сможет выйти за пределы 0-100 лет)
  297. person_form: {
  298. function createPersonClosure(name, surname) {
  299. let age;
  300. let fatherName;
  301. let obj = {
  302. getName() {
  303. return name;
  304. },
  305. getSurname() {
  306. return surname;
  307. },
  308. getFatherName() {
  309. return fatherName;
  310. },
  311. getAge() {
  312. return age;
  313. },
  314. getFullName() {
  315. return surname + ' ' + name + ' ' + fatherName;
  316. },
  317. setName(newName) {
  318. if (validateName(newName)) {
  319. name = newName;
  320. } else {
  321. alert('ERROR. You need write string with big first letter');
  322. }
  323. return name;
  324. },
  325. setSurname(newSurname) {
  326. if (validateName(newSurname)) {
  327. surname = newSurname;
  328. } else {
  329. alert('ERROR. You need write string with big first letter');
  330. }
  331. return surname;
  332. },
  333. setFatherName(newFatherName) {
  334. if (validateName(newFatherName)) {
  335. fatherName = newFatherName;
  336. } else {
  337. alert('ERROR. You need write string with big first letter');
  338. }
  339. return fatherName;
  340. },
  341. setFullName(str) {
  342. let fullNameArray = str.split(' ');
  343. while (fullNameArray.length < 3) {
  344. fullNameArray.push(null);
  345. }
  346. surname = this.setSurname(fullNameArray[0]);
  347. name = this.setName(fullNameArray[1]);
  348. fatherName = this.setFatherName(fullNameArray[2]);
  349. return fullNameArray.filter(item => item !== null).join(' ');
  350. },
  351. setAge(newAge) {
  352. if (newAge >= 0 && newAge <= 100 || newAge == '') {
  353. age = newAge;
  354. } else {
  355. alert('ERROR');
  356. }
  357. return age;
  358. },
  359. }
  360. function validateName(name) {
  361. return name == null || name.charCodeAt(0) >= 65 && name.charCodeAt(0) <= 90 ||
  362. name.charCodeAt(0) >= 1040 && name.charCodeAt(0) <= 1071 || name == '';
  363. }
  364. return obj;
  365. }
  366. const b = createPersonClosure("Анна", "Иванова");
  367. b.setAge(15);
  368. b.setFullName("Петрова Анна Николаевна");
  369. function createForm(domElement, person) {
  370. let name = document.createElement('input');
  371. name.value = person.getName();
  372. domElement.append(name);
  373. let surname = document.createElement('input');
  374. surname.value = person.getSurname();
  375. domElement.append(surname);
  376. let fatherName = document.createElement('input');
  377. fatherName.value = person.getFatherName();
  378. domElement.append(fatherName);
  379. let age = document.createElement('input');
  380. age.value = person.getAge();
  381. domElement.append(age);
  382. let fullName = document.createElement('input');
  383. fullName.value = person.getFullName();
  384. domElement.append(fullName);
  385. name.oninput = () => {
  386. name.value = person.setName(name.value);
  387. }
  388. surname.oninput = () => {
  389. surname.value = person.setSurname(surname.value);
  390. }
  391. fatherName.oninput = () => {
  392. fatherName.value = person.setFatherName(fatherName.value);
  393. }
  394. age.oninput = () => {
  395. age.value = person.setAge(age.value);
  396. }
  397. fullName.oninput = () => {
  398. fullName.value = person.setFullName(fullName.value);
  399. surname.value = fullName.value.split(' ')[0] || '';
  400. name.value = fullName.value.split(' ')[1] || '';
  401. fatherName.value = fullName.value.split(' ')[2] || '';
  402. }
  403. }
  404. createForm(document.body, b);
  405. }
  406. get_set_form: {
  407. function createPersonClosure(name, surname) {
  408. let age;
  409. let fatherName;
  410. let obj = {
  411. getName() {
  412. return name;
  413. },
  414. getSurname() {
  415. return surname;
  416. },
  417. getFatherName() {
  418. return fatherName;
  419. },
  420. getAge() {
  421. return age;
  422. },
  423. getFullName() {
  424. return surname + ' ' + name + (fatherName ? ' ' + fatherName : '');
  425. },
  426. setName(newName) {
  427. if (validateName(newName)) {
  428. name = newName;
  429. } else {
  430. alert('ERROR. You need write string with big first letter');
  431. }
  432. return name;
  433. },
  434. setSurname(newSurname) {
  435. if (validateName(newSurname)) {
  436. surname = newSurname;
  437. } else {
  438. alert('ERROR. You need write string with big first letter');
  439. }
  440. return surname;
  441. },
  442. setFatherName(newFatherName) {
  443. if (validateName(newFatherName)) {
  444. fatherName = newFatherName;
  445. } else {
  446. alert('ERROR. You need write string with big first letter');
  447. }
  448. return fatherName;
  449. },
  450. setFullName(str) {
  451. let fullNameArray = str.split(' ');
  452. while (fullNameArray.length < 3) {
  453. fullNameArray.push(null);
  454. }
  455. surname = this.setSurname(fullNameArray[0]);
  456. name = this.setName(fullNameArray[1]);
  457. fatherName = this.setFatherName(fullNameArray[2]);
  458. return fullNameArray.filter(item => item !== null).join(' ');
  459. },
  460. setAge(newAge) {
  461. if (newAge >= 0 && newAge <= 100 || newAge == '') {
  462. age = newAge;
  463. } else {
  464. alert('ERROR');
  465. }
  466. return age;
  467. },
  468. }
  469. function validateName(name) {
  470. return name == null || name.charCodeAt(0) >= 65 && name.charCodeAt(0) <= 90 ||
  471. name.charCodeAt(0) >= 1040 && name.charCodeAt(0) <= 1071 || name == '';
  472. }
  473. return obj;
  474. }
  475. let car;
  476. {
  477. let brand = 'BMW', model = 'X5', volume = 2.4
  478. car = {
  479. getBrand() {
  480. return brand
  481. },
  482. setBrand(newBrand) {
  483. if (newBrand && typeof newBrand === 'string') {
  484. brand = newBrand
  485. }
  486. return brand
  487. },
  488. getModel() {
  489. return model
  490. },
  491. setModel(newModel) {
  492. if (newModel && typeof newModel === 'string') {
  493. model = newModel
  494. }
  495. return model
  496. },
  497. getVolume() {
  498. return volume
  499. },
  500. setVolume(newVolume) {
  501. if (newVolume && typeof newVolume === 'number' && newVolume > 0 && newVolume < 20) {
  502. volume = newVolume
  503. }
  504. return volume
  505. },
  506. getTax() {
  507. return volume * 100
  508. }
  509. }
  510. }
  511. function getSetForm(parent, getSet) {
  512. const inputs = {}; //реестр
  513. const updateInputs = () => {
  514. for (const fieldName in inputs) {
  515. const getKey = `get` + fieldName;
  516. if (getKey in getSet) {
  517. inputs[fieldName].value = getSet[getKey]() || '';
  518. }
  519. }
  520. };
  521. for (const getSetName in getSet) {
  522. const getOrSet = getSetName.slice(0, 3);
  523. const fieldName = getSetName.slice(3);//остальные буквы getSetName - типа "Name" или "FullName"
  524. const setKey = `set` + fieldName;
  525. const getKey = `get` + fieldName;
  526. if (!(fieldName in inputs)) {
  527. inputs[fieldName] = document.createElement('input');
  528. parent.append(inputs[fieldName]);
  529. if (!(setKey in getSet)) {
  530. inputs[fieldName].disabled = true;
  531. }
  532. inputs[fieldName].type = typeof getSet[getKey]();
  533. inputs[fieldName].placeholder = fieldName;
  534. inputs[fieldName].oninput = () => {
  535. inputs[fieldName].value = getSet[setKey](inputs[fieldName].value);
  536. updateInputs();
  537. };
  538. }
  539. }
  540. updateInputs();
  541. }
  542. getSetForm(document.body, car);
  543. getSetForm(document.body, createPersonClosure('Анон', "Анонов"));
  544. }