HW11.js 24 KB

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