123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551 |
- /*Arrow to Functions
- Переведите любые пять заданий из предыдущего ДЗ по функциям в синтаксис function*/
- /* 1. Calc Func
- Вспомните первое ДЗ по Javascript, в котором вы делали всякие расчеты используя код на Javascript. Оформите это как функцию:
- найдите все входящие данные, сделайте из них параметры
- найдите переменную с результатом расчетов и сделайте так, что бы ваша функция возвращала этот результат.
- Если результатов несколько, создайте объект из этих результатов и верните его. */
- {
- function bikeRentCalculator(bikes, bikesCategory, bikesCost, timeRent) {
- let costResult = bikes * bikesCost * timeRent;
- return {
- bikes,
- bikesCategory,
- bikesCost,
- timeRent,
- costResult,
- }
- }
- }
- //2. Temperature
- //Оформите Temperature как функцию, в которую параметром передается температура в одной системе, а возвращается в другой. Никаких prompt и console.log в коде быть не должно, если вы хотите в дальнейшем пользоваться этой функцией где угодно в коде удобно. Нужен ли блок кода в функции для решения этой задачи?
- {
- function temperatureCtoF(c) {
- return c * 9 / 5 + 32
- }
- }
- /*3. Flats
- Оформите Number: flats как функцию. Продумайте достаточное количество параметров для решения задачи. Функция должна возвращать объект вида {entrance, floor}, где entrance - номер падика, floor - номер этажа на котором находится квартира.*/
- {
- function entranceAndFlor(apartmentNumber, houseFloors, apartmentОnFloor) {
- const apartmentOnFrontDoor = houseFloors * apartmentОnFloor;
- const apartmentNumberInFrontDoor = (apartmentNumber - 1) % apartmentOnFrontDoor;
- const floor = Math.floor(apartmentNumberInFrontDoor / apartmentОnFloor) + 1;
- const entrance = Math.ceil(apartmentNumber / apartmentOnFrontDoor);
- return result = {
- entrance,
- floor
- }
- }
- console.log(entranceAndFlor(36, 9, 4))
- }
- /*4. New line
- Оформите задание String: new line как функцию с параметром-строкой. Функция должна возвращать строку с настоящими переносами. */
- {
- function stringNewline(str) {
- return str.split('\\n').join('\n')
- }
- console.log(stringNewline('sdf\n\nsdf\nsdf'))
- }
- /*5. For Multiply Table
- Выведите таблицу умножения 5x5 из задания Multiply table в таблицу, используя вложенные for .... of и document.write
- Сделайте черезстрочную подсветку - задавайте четным строкам один цвет фона, нечетным - другой*/
- {
- const arr = [
- [0, 0, 0, 0, 0, 0],
- [0, 1, 2, 3, 4, 5],
- [0, 2, 4, 6, 8, 10],
- [0, 3, 6, 9, 12, 15],
- [0, 4, 8, 12, 16, 20],
- [0, 5, 10, 15, 20, 25]
- ];
- function arrToHtml(arr) {
- let str = "<table>"
- let i = 1
- for (let tr of arr) {
- if (i++ % 2 === 0) {
- str += '<tr style="background-color: grey;">'
- } else {
- str += "<tr>"
- }
- for (let td of tr) {
- str += "<td>" + td + "</td>"
- }
- str += "</tr>"
- }
- str += "</table>"
- return (str)
- }
- console.log(arrToHtml(arr))
- }
- /*createPerson
- Создайте функцию createPerson, которая принимает два параметра: name и surname, и возвращает объект с ключами name, surname, getFullName. getFullName должна быть функцией, которая работает с объектом через this, а так же готова к тому, что в объекте в последствии добавить ключ fatherName*/
- {
- const a = createPerson("Вася", "Пупкин")
- const b = createPerson("Анна", "Иванова")
- const c = createPerson("Елизавета", "Петрова")
- console.log(a.getFullName()) //Вася Пупкин
- a.fatherName = 'Иванович' //Вася Иванович Пупкин
- console.log(a.getFullName())
- console.log(b.getFullName()) //Анна Иванова*/
- function createPerson(name, surname) {
- return {
- name,
- surname,
- getFullName() {
- return `${this.name} ${this.fatherName || ""} ${this.surname}`
- }
- }
- }
- }
- /*createPersonClosure
- Задание в целом, аналогично предыдущему, однако, в объект заносить name, surname, fatherName и age не нужно. name и surname должны быть параметрами, переменные age и fatherName объявите через let в теле createPersonClosure. Внутри createPersonClosure объявите следующие функции:
- getName
- getSurname
- getFatherName
- getAge
- getFullName
- Эти функции должны возвращать переменные, объявленные в функции createPersonClosure
- Следующие функции:
- setName
- setSurname
- setFatherName
- setAge
- setFullName
- должны принимать один параметр (newName, newSurname и т.п.), проверять его на корректность и менять значение переменных, объявленных внутри createPersonClosure. Проверки на корректность:
- имя, фамилия, отчество должно быть строкой с большой буквы
- возраст должен быть числом от 0 до 100.
- Если проверка на корректность не пройдена, функция не должна менять соответстующую переменную.
- Функция setFullName должна разбивать строку по пробелам и заносить части строки в surname, name и fatherName
- Все функции set должны возвращать то значение, которое по итогу попало во внутренюю переменную. То есть если новое значение некорректно, то функция возвращает старое значение
- В объекте-результате createPersonClosure должны быть только эти 10 функций (геттеров и сеттеров). В коде функций this не используется
- const a = createPersonClosure("Вася", "Пупкин")
- const b = createPersonClosure("Анна", "Иванова")
- console.log(a.getName())
- a.setAge(15)
- a.setAge(150) //не работает
- b.setFullName("Петрова Анна Николаевна")
- console.log(b.getFatherName()) //Николаевна*/
- {
- function createPersonClosure(name, surname) {
- let age
- let fatherName
- return {
- getName() { return name },
- getSurname() { return surname },
- getFatherName() { return fatherName },
- getAge() { return age },
- getFullName() { return `${name} ${fatherName || ""} ${surname}` },
- setName(newName) { if (newName[0] === newName[0].toUpperCase()) name = newName; return name },
- setSurname(newSurname) { if (newSurname[0] === newSurname[0].toUpperCase()) surname = newSurname; return surname },
- setFatherName(newFatherName) { if (newFatherName[0] === newFatherName[0].toUpperCase()) fatherName = newFatherName; return fatherName },
- setAge(newAge) { if (newAge >= 0 && newAge <= 100) age = newAge; return age },
- setFullName(newFullName) {
- let arr = newFullName.split(" ")
- if (arr[0][0] === arr[0][0].toUpperCase() &&
- arr[1][0] === arr[1][0].toUpperCase() &&
- arr[2][0] === arr[2][0].toUpperCase()) {
- surname = arr[0]
- name = arr[1]
- fatherName = arr[2]
- } return this.getFullName()
- }
- }
- }
- const a = createPersonClosure("Вася", "Пупкин")
- const b = createPersonClosure("Анна", "Иванова")
- console.log(a.getName())
- console.log(a.setAge(15))
- console.log(a.getAge())
- console.log(a.setAge(150)) //не работает
- console.log(a.getAge())
- console.log(b.setFullName("Петрова Анна Николаевна"))
- console.log(b.getFatherName()) //Николаевна*/
- }
- /*createPersonClosureDestruct
- Сделайте набор параметров функции из предыдущего задания объектом, используйте деструктуризацию для извлечения параметров.
- Задайте значения по умолчанию
- const a = createPersonClosureDestruct(createPerson("Вася Пупкин"))
- const b = createPersonClosureDestruct({name: 'Николай', age: 75})*/
- {
- function createPersonClosureDestruct({ name = "Анон", surname = "Анонов", fatherName = "Анонович", age = "х.з." } = {}) {
- const obj = {
- name,
- surname,
- fatherName,
- age,
- }
- return obj
- }
- function createPerson(name, surname) {
- return {
- name,
- surname,
- getFullName() {
- return `${this.name} ${this.fatherName || ""} ${this.surname}`
- }
- }
- }
- const a = createPersonClosureDestruct(createPerson("Вася Пупкин")) // не очень понятно что должно получится в задании. В createPerson мы принимали два параметра соответвенно если так передать оба слова залетят в name. надеюсь так и задумано или я где-то не понял условие...
- const b = createPersonClosureDestruct({ name: 'Николай', age: 75 })
- console.log(createPerson("Вася Пупкин"))
- console.log(a)
- console.log(b)
- }
- /*isSorted
- Напишите функцию isSorted, которая принимает набор параметров любого размера, и возвращает true, когда все параметры - это числа, и каждое из них больше предыдущего параметра.*/
- {
- function isSorted(...arr) {
- console.log(arr)
- if (typeof arr[0] !== "number" || isNaN(arr[0])) return false
- let previousItem = arr[0]
- for(let i = 1; i<arr.length; i++){
- if (typeof arr[i] !== "number" || isNaN(arr[i]) || previousItem > arr[i] ) return false;
- previousItem = arr[i]
- }
- return true
- }
- console.log( isSorted(1,5,{},15,7,6,5) )
- console.log( isSorted(1,5,3,15,7,6,5) )
- console.log( isSorted(1,5,[7],15,7,6,5) )
- console.log( isSorted(1,NaN,7,15,20,25,30) )
- console.log( isSorted(1,5,7,15,20,25,30) )
- }
- /*Test isSorted
- Используя циклический ввод в массив (задание array fill), обеспечьте ввод данных для isSorted*/
- /*array fill
- Создайте пустой массив и добавляйте в него элементы, пока пользователь не нажмет Отмена в очередном prompt. Используйте push для удобства: push*/
- {
- function isSorted(arr) {
- console.log(arr)
- if (typeof arr[0] !== "number" || isNaN(arr[0])) return false
- let previousItem = arr[0]
- for (let i = 1; i < arr.length; i++) {
- if (typeof arr[i] !== "number" || isNaN(arr[i]) || previousItem > arr[i]) return false;
- previousItem = arr[i]
- }
- return true
- }
- function isSortedArrValue() {
- const arr = []
- let i
- while ((i = prompt('добавить в массив или отмена для проверки isSorted')) !== null) {
- if (i !== "") arr.push(+i)
- }
- alert('вы наклацали ' + arr)
- return arr
- }
- console.log(isSorted(isSortedArrValue()))
- }
- /* personForm
- Напишите функцию, которая принимает два параметра: родительский DOM-элемент и объект-результат работы createPersonClosure (или createPersonClosureDestruct, результаты у обоих этих функций одинаковые) и рисует форму, которая позволяет редактировать данные о персоне.
- В начале работы personForm создает 5 полей ввода (имя, фамилия, отчество, возраст, ФИО) в родительском DOM-элементе и устанавливает туда значения, прочитанные с помощью getName, getSurname и т.д.
- По событию oninput в любом из полей ввода нужно запускать соответствующий set..... Например при изменении поля ввода имени должен запускаться setName(какой-то инпут.value). Функции set... возвращают значение, и его нужно занести обратно в input. Таким образом в полях ввода невозможно будет ввести некорректные значения (например возраст не сможет выйти за пределы 0-100 лет)
- const b = createPersonClosure("Анна", "Иванова")
- b.setAge(15)
- b.setFullName("Петрова Анна Николаевна")
- */
- {
- function createPersonClosure(name, surname) {
- let age
- let fatherName
- return {
- getName() { return name },
- getSurname() { return surname },
- getFatherName() { return fatherName },
- getAge() { return age },
- getFullName() {
- return `${name} ${fatherName || ""} ${surname}`
- },
- setName(newName) {
- if (newName === "") {name = newName; return name}
- if (newName[0] === newName[0].toUpperCase() && newName[0] !== " ") name = newName; return name },
- setSurname(newSurname) {
- if (newSurname === "") {surname = newSurname; return surname}
- if (newSurname[0] === newSurname[0].toUpperCase() && newSurname[0] !== " ") surname = newSurname; return surname },
- setFatherName(newFatherName) {
- if (newFatherName === "") {fatherName = newFatherName; return fatherName}
- if (newFatherName[0] === newFatherName[0].toUpperCase() && newFatherName[0] !== " ") fatherName = newFatherName; return fatherName },
- setAge(newAge) { if (newAge >= 0 && newAge <= 100) age = newAge; return age },
- setFullName(newFullName) {
-
- let arr = newFullName.split(" ")
- if (arr[2] !== undefined){
- name = arr[0]
- fatherName = arr[1]
- surname = arr[2]
- return this.getFullName()
- }else if (arr[1] !== undefined){
- name = arr[0]
- fatherName = arr[1]
- surname = ""
- return this.getFullName()
- }else if(arr[0] !== undefined){
- name = arr[0]
- fatherName = ""
- surname = ""
- //return this.getFullName()
- }
- }
- }
- }
- function personForm(parent, person){
- //насоздавать инпутов (5 штук)
- let inputName = document.createElement('input')
- inputName.value = person.getName()
- let inputFatherName = document.createElement('input')
- inputFatherName.value = person.getFatherName()
- let inputSurname = document.createElement('input')
- inputSurname.value = person.getSurname()
- let inputAge = document.createElement('input')
- inputAge.value = person.getAge()
- inputAge.type = "number"
- let inputFullName = document.createElement('input')
- inputFullName.value = person.getFullName()
- //надобавлять их в parent
- parent.append(inputName)
- parent.append(inputFatherName),
- parent.append(inputSurname)
- parent.append(inputAge)
- parent.append(inputFullName)
- //навесить каждому из них обработчик события типа nameInput.oninput = () => {
- //тут пытаемся менять person используя person.setName. Текст в инпуте должен стать таким, который вернет setName
- //}
- inputName.oninput = () => {
- inputName.value = person.setName(inputName.value)
- inputFullName.value = person.getFullName()
- }
- inputSurname.oninput = () => {
- inputSurname.value = person.setSurname(inputSurname.value)
- inputFullName.value = person.getFullName()
- }
- inputFatherName.oninput = () => {
- inputFatherName.value = person.setFatherName(inputFatherName.value)
- inputFullName.value = person.getFullName()
- }
- inputAge.oninput = () => {
- inputAge.value = person.setAge(inputAge.value)
- }
- inputFullName.oninput = () => {
- inputFullName.value = person.setFullName(inputFullName.value)
- inputName.value = person.getName()
- inputSurname.value = person.getSurname()
- inputFatherName.value = person.getFatherName()
- }
- }
- const b = createPersonClosure("Анна", "Иванова")
- b.setAge(15)
- b.setFullName("Анна Николаевна Петрова")
- personForm(document.body, b)
- }
- /*getSetForm
- Сделайте функцию, которая решает предыдущую задачу универсально, то есть для любого объекта, в котором есть набор функций get... и set.... Кода станет меньше, гибкости больше, ведь в предыдущем задании много копипасты (x5)*/
- {
- function createPersonClosure(name, surname) {
- let age
- let fatherName
- return {
- getName() { return name },
- getSurname() { return surname },
- getFatherName() { return fatherName },
- getAge() { return age },
- getFullName() {
- return `${name} ${fatherName || ""} ${surname}`
- },
- setName(newName) {
- if (newName === "") {name = newName; return name}
- if (newName[0] === newName[0].toUpperCase() && newName[0] !== " ") name = newName; return name },
- setSurname(newSurname) {
- if (newSurname === "") {surname = newSurname; return surname}
- if (newSurname[0] === newSurname[0].toUpperCase() && newSurname[0] !== " ") surname = newSurname; return surname },
- setFatherName(newFatherName) {
- if (newFatherName === "") {fatherName = newFatherName; return fatherName}
- if (newFatherName[0] === newFatherName[0].toUpperCase() && newFatherName[0] !== " ") fatherName = newFatherName; return fatherName },
- setAge(newAge) { if (newAge >= 0 && newAge <= 100) age = newAge; return age },
- setFullName(newFullName) {
-
- let arr = newFullName.split(" ")
- if (arr[2] !== undefined){
- name = arr[0]
- fatherName = arr[1]
- surname = arr[2]
- return this.getFullName()
- }else if (arr[1] !== undefined){
- name = arr[0]
- fatherName = arr[1]
- surname = ""
- return this.getFullName()
- }else if(arr[0] !== undefined){
- name = arr[0]
- fatherName = ""
- surname = ""
- return this.getFullName()
- }
- }
- }
- }
- let car;
- {
- let brand = 'BMW', model = 'X5', volume = 2
- car = {
- getBrand(){
- return brand
- },
- setBrand(newBrand){
- if (newBrand && typeof newBrand === 'string'){
- brand = newBrand
- }
- return brand
- },
-
- getModel(){
- return model
- },
- setModel(newModel){
- if (newModel && typeof newModel === 'string'){
- model = newModel
- }
- return model
- },
-
- getVolume(){
- return volume
- },
- setVolume(newVolume){
- newVolume = +newVolume
- if (newVolume && newVolume > 0 && newVolume < 20){
- volume = newVolume
- }
- return volume
- },
-
- getTax(){
- return volume * 100
- }
- }
- }
- function getSetForm(parent, getSet){
- const inputs = {} //реестр
-
- const updateInputs = (inputs, getSet) => {
-
- //функция обновления полей ввода согласно всяким get....
- //тут должен быть перебор
- for (const inputKey in inputs){
- let key = 'get' + inputKey
- if (key in getSet) inputs[inputKey].value = getSet[key]()
- }
- }
-
- for (const getSetName in getSet){
- const getOrSet = getSetName[0] + getSetName[1] + getSetName[2]
- const [,,,...arr] = getSetName
- fieldName = arr.join('')
- const setKey = `set` + fieldName
- const getKey = `get` + fieldName
-
- if ( !(fieldName in inputs)){
- inputs[fieldName] = document.createElement('input')
- }
- if (!(setKey in getSet)) {
- inputs[fieldName].disabled = true
- }
- inputs[fieldName].placeholder = fieldName
- if (getSet[getKey]() !== undefined) {inputs[fieldName].value = getSet[getKey]()}
- //const typeValue = typeof getSet[getSetName]()
- const typeValue = typeof getSet[getKey]()
- let typeHtml
- if (typeValue === "number") typeHtml = "number";
- if (typeValue === "string") typeHtml = "text";
- if (typeValue === "boolean") typeHtml = "checkbox";
- inputs[fieldName].type = typeHtml
-
- const element = inputs[fieldName]
- element.oninput = () => {
-
-
- element.value = getSet[setKey](element.value)
- console.log(element.value)
- //console.log(inputs[fieldName].value)
- //console.log(getSet[setKey])
- updateInputs(inputs, getSet)
- }
- //допишите тут все шо надо, и не только тут
- //console.log(inputs[fieldName].value)
- //console.log(getSet[setKey])//(inputs[fieldName].value))
- }
- console.log(inputs)
- for (key in inputs){
- parent.append(inputs[key])
- }
- }
- let b = createPersonClosure('Анон', "Анонов")
- getSetForm(document.body, car)
- getSetForm(document.body, b)
- console.log(b)
- console.log(car)
- }
|