index.js 24 KB

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