Практика JavaScript

Практика javascript 2019 года


Реализуйте функцию palmTree(n), которая будет принимать целое положительное n и возвращать строку, состоящую из символов «🌴«. Например, вызов palmTree(3) приведёт к тому, что функция вернёт «🌴🌴🌴«. Примечание: при нечисловом аргументе функция должна вернуть false, а при вызове без аргумента — один символ «🌴«. Примечание 2: хорошо, если это задание показалось вам простым. Оно рассчитано на закрепление основ JavaScript начинающими разработчиками.


Реализуйте функцию autoReplace(needles,change,haystack), которая будет принимать целое массив строк, которые нужно поменять на строку change внутри строки haystack. Например, вызов функции

autoReplace([‘салат’,’помидоры’], ‘еда’, ‘свежие помидоры пошли в салат’)

должна вернуть строку ‘свежие еда пошли в еда’.

Примечание: если хотите, тут можно использовать регулярные выражения, но это не обязательное требование, при этом регистр не должен учитываться. При отсутствии параметров должен вернуться false


Создайте функцию autoTags(str, tags, url), которая принимает входную строку str, массив слов для замены на теги и базовый URL (по умолчанию должен иметь значение «https://mysite.local/tag/»), которые нужно сделать тегами в строке str. Например, вызов функции

autoTags(‘интересно изучать js’, [‘html’,’js’])

должен вернуть строку

‘интересно изучать <a href=»https://mysite.local/tag/js«>@js</a>’

Примечание: если вы увидите как замыкание может упростить работу над задачей, используйте его.


Реализуйте функцию genitive(n, word). Функция принимает положительное целое число и объект word с вариантами записи слов для разных чисел. Объект word имеет свойства singular many1 many2, например {singular:’товар’, many1:’товара’, many2:’товаров’}. Функция должна корректно возвращать строку вида ‘2 товара’ или ’29 товаров’. Например, при вызове

genitive(5, {singular:’курс’, many1:’курса’, many2:’курсов’})

функция должен вернуть строку ‘5 курсов’

 


Создайте объект classNames со свойством cname и методами

add( String [,String] )Добавляет к cname классы

remove( String [,String] ) Удаляет из cname классы

toggle ( String [, Boolean])Если класс у элемента отсутствует — добавляет, иначе — убирает. Когда вторым параметром передано false — удаляет указанный класс, а если true — добавляет.

Например, значение classNames.cname = «btn». После вызова classNames.toggle(‘btn-primary’) значение classNames.cname должно стать «btn btn-primary». При повторном вызове classNames.toggle(‘btn-primary’), значение должно вернуться в «btn»

Примечание: это пригодится в дальнейшем при работе с Познакомьтесь с интерфейсом https://developer.mozilla.org/ru/docs/Web/API/Element/classList.


Напишите функцию lorem(n), которая принимает положительное целое n (от 1 до 445) и при вызове возвращает строку длиной n символов из строки

«Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.»

Например, при вызове lorem(100) функция должна вернуть строку

«Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore «


Напишите функцию myReplace(s1, s2, s3), которая будет принимать три строковых аргумента s1, s2, s3 и заменять в первом аргументе s1 все слова, совпадающие со вторым аргументом s2, на третий аргумент s3. Функция должна возвращать изменённую строку. Например, вызов

myReplace(«Ехал Грека, через реку», «р», «л»)

должен вернуть строку «Ехал Глека, челез леку»

Примечание: эта задача является частным случаем одной из предыдущих задач. Она более простая, позволяет отдохнуть и приступить к следующим задачам. Внимание, функция должна учитывать регистр слов.


 

Напишите функцию getPhraseByNum(n), которая принимает целое число n в диапазоне от 0 до 9999 и возвращает строку с описанием числа. Например, вызов функции

getPhraseByNum(2310)

должен вернуть строку «две тысячи триста десять»


Напишите функцию directionByKeyCode(keyCode), которая принимает одно из чисел 87, 65, 68 или 83, а возвращает соответственно одну из строк ‘вверх ↑’, ‘влево ←’, ‘вправо →’,’вниз ↓’. Например, вызов

directionByKeyCode(87)

должен вернуть ‘вверх ↑’


Напишите функцию byDesc(arr), которая на вход принимает числовой массив и возвращает массив отсортированный по убыванию. Например, вызов byDesc([3,10,2,7]) должен вернуть [10,7,3,2]


Напишите функцию oddity(arr), которая на вход принимает числовой массив и возвращает массив отсортированный так, что в начале массива идут все нечётные числа, а потом все чётные. Например, вызов oddity([3,10,2,7]) должен вернуть [7,3,10,2]. Формально, правильным ответом является и [3,7,2,10], но мы будем придерживаться детерминистского подхода


Напишите функцию byLength(str), которая на вход принимает массив строк, а возвращает массив строк отсортированный по убыванию количества символов в строке. Например, вызов byLength([‘колхоз’,’гладиолус’,’вода’,’книга’]) должен вернуть [‘гладиолус’,’колхоз’,’книга’,’вода’]


Дан массив объектов

const users = [
  {name: 'Василий', lang: 'JavaScript', age: 23},
  {name: 'Яна', lang: 'Java', age: 35},
  {name: 'Олег', lang: 'Python', age: 19},
  {name: 'Наталья', lang: 'C#', age: 20},
  {name: 'Ольга', lang: 'PHP', age: 29},
];

Реализуйте функцию sortBy(usersArray,prop), которая принимает массив подобный массиву users и строчное название поле сортировки prop, которое по умолчанию равно ‘name’, в возвращает массив объектов по возрастанию числового признака или по алфавиту для строкового признака. Например, вызов

sortBy(users ,’age’)

должен вернуть отсортированный массив

[
  {name: 'Олег', lang: 'Python', age: 19},
  {name: 'Наталья', lang: 'C#', age: 20},
  {name: 'Василий', lang: 'JavaScript', age: 23},
  {name: 'Ольга', lang: 'PHP', age: 29},
  {name: 'Яна', lang: 'Java', age: 35},  
]

примечание: возможно пригодится https://www.youtube.com/watch?v=8JsteOQxJZc

Напишите функцию sortEmail(arr), которая сортирует массив строк с электронными адресами по имени домена (точнее по части, идущей после символа ‘@’). Например, вызов функции

sortEmail([‘m@bsite.loc’,’m@csite.loc’,’m@asite.loc’])

должен вернуть массив [‘m@asite.loc’, ‘m@bsite.loc’, ‘m@csite.loc’]


Напишите функцию stepByStep(num1, num2, step), которая принимает два числа num1, num2 и аргумент step с количеством «шагов», которые нужно построить между числами num1 и num2. Функция должна возвращать массив чисел между num1 и num2, включая последние. Например, при вызове

stepByStep(0, 10, 2)

функция должна вернуть массив чисел [0,5,10], а при вызове

stepByStep(20, 40, 5)

вернуть массив [20, 24, 28, 32, 36, 40]


Напишите функцию gradient(color1, color2, step), которая принимает две строки с цветами в формате ‘#rrggbb’ в переменные color1, color2 и аргумент step с количеством «шагов», которые нужно построить между цветами color1 и color2. Функция должна возвращать массив строк с промежуточными цветами в формате rgb(). Например, при вызове

gradient(‘#000000′,’#ffffff’,16)

функция должна вернуть массив строк:

[‘rgb(0,0,0)’,’rgb(16,16,16)’,’rgb(32,32,32)’,’rgb(48,48,48)’,’rgb(64,64,64)’,’rgb(80,80,80)’,’rgb(96,96,96)’,’rgb(112,112,112)’,’rgb(128,128,128)’,’rgb(143,143,143)’,’rgb(159,159,159)’,’rgb(175,175,175)’,’rgb(191,191,191)’,’rgb(207,207,207)’,’rgb(223,223,223)’,’rgb(239,239,239)’,’rgb(255,255,255)’]

а для вызова gradient(‘#336699′,’#89ef12’,5) вернётся

[‘rgb(51,102,153)’,’rgb(68,129,126)’,’rgb(85,157,99)’,’rgb(103,184,72)’,’rgb(120,212,45)’,’rgb(137,239,18)’]


Напишите функцию randRange(n1,n2), которая возвращает случайное целое в диапазоне от n1 до n2. Например, вызов функции с аргументами

randRange(50,76)

может вернуть 59 или 63. n1 и n2 должны быть включены в диапазон генерации


Написать функцию nearestDistance(point, points), которая принимает объект point со свойствами x и y соответствующими координатам на плоскости, и массив points подобных объектов с другими координатами. Функция должна возвращать индекс ближайшей точки из массива points. Например, при вызове

 

nearestDistance({x: 0, y: 0}, [     
  {x: 10, y: 10},
  {x: 2, y: 5},
  {x: 3, y: 4}
])

 

функция должна вернуть число 2, потому как {x: 3, y: 4} является ближайшей к {x: 0, y: 0}


Есть объект со структурой

const categories = {
 category: "Компьютеры",
 next: {
     category: "Ноутбуки",
     next: {
       category: "Все ноутбуки",
       next: {
         category: "Игровые",
         next: null
       }
     }
  }
}

Написать функцию category(categories), которая принимает объект типа categories и возвращает строку. Например, вызов

category(categories)

должен вернуть строку ‘Компьютеры/Ноутбуки/Все ноутбуки/Игровые’


Как представить 9500руб как можно меньшим количеством купюр достоинством 5000, 2000, 200, 100 рублей? Напишите функцию search(n), которая принимает целое число кратное ста и возвращает объект со свойствами в виде номинала купюр и значениями — их количеством. Например, вызов

search(12100)

должен вернуть объект {‘100’: 1, ‘2000’: 1, ‘5000’: 2}


Написать функцию getWordStat(str), которая принимает строковую переменную str, а возвращает массив объектов. Каждый объект хранит одно свойство — слово и одно значение — количество вхождений этого слова в строку str. В возвращающемся массиве не должны учитываться знаки препинания, пробельные символы и пустые строки. Например, вызов  

getWordStat(‘Ехал Грека, через реку реку реку’)

должен вернуть

[
  {'Ехал' : 1},
  {'Грека' : 1},
  {'через' : 1},
  {'реку' : 3}
]

Напишите функцию extractProps(arrObjects,prop), которая по значению аргумента prop вернёт массив всех одноимённых свойств из объектов массива arrObjects. Например, вызов

extractProps([
  {name: "Василий", age: 34},
  {name: "Наталья", age: 27},
  {name: "Джон", age: 19}
],"name")

вернёт массив [«Василий»,»Наталья»,»Джон»]


Написать функцию bmi(m,h), которая принимает аргументы m (массу тела в килограммах) и h (рост человека в метрах), а  возвращает индекс массы тела (https://ru.wikipedia.org/wiki/%D0%98%D0%BD%D0%B4%D0%B5%D0%BA%D1%81_%D0%BC%D0%B0%D1%81%D1%81%D1%8B_%D1%82%D0%B5%D0%BB%D0%B0 )

Например, при массе человека 100кг и росте 1.8м
bmi(100,1.8)

функция должна вернуть 30.86


Напишите функцию quadro(), которая будет принимать неограниченное количество целочисленных аргументов, а возвращать массив квадратов этих чисел

Например, вызов

quadro(2,6,10,4)

должен вернуть [4,36,100,16]


Напишите функцию fib(n), которая получает целое число n, а возвращает массив из n элементов последовательности Фибоначчи (0,1,1,2,3,5…)

Например, при вызове функция

fib(4)

должна вернуть массив [0,1,1,2]


Напишите функцию fibNthElement(n), которая получает целое число n, а возвращает n-й элемент последовательности Фибоначчи (1,1,2,3…)

Например, при вызове функция

fibNthElement(4)

должна вернуть массив 2


Реализуйте тело функции sequence(numArr) так, чтобы она возвращала другую функцию возвращающую поочередно элементы массива numArr. Например, первый вызов some()

let some = sequence([10,5,2,1]);

some();

должен вернуть 10, потом 5 и так далее.


Реализуйте функцию days(), которая возвращает количество дней (полных суток) оставшихся до грядущего Нового Года.


Реализуйте функцию differenceDays(d1, d2), которая возвращает количество дней (полных суток) между двумя датами d1 и d2 заданными через конструктор Date. Например, вызов

differenceDays(new Date(2018,9,5),new Date(2018,9,7))

должен вернуть 2


Реализуйте функцию differenceTimes(d1, d2), которая возвращает строку в формате «hhh:mm:ss» соответствующую разнице между двумя датами в часах, минутах и секундах. Если количество минут или секунд задается не двузначным числом, нужно предварять их нулем. Например, вызов

differenceTimes(new Date(2018,9,7,10,10,20),new Date(2018,9,7,12,13,24))

должен привести к возврату ‘2:03:04’


Напишите функцию checkPhone(phone), которая на вход принимает строку с номером телефона и возвращает true, если номер подходит к шаблону вида «+X(XXX)XXX-XX-XX», где X — любое целое от 0 до 9. Если строка не подходит, то функция должна возвращать false. Например, вызов

checkPhone(‘+7(495)000-00-00’)

вернёт true


Напишите функцию validPhone(phone), которая на вход принимает строку с номером телефона, а возвращает строку типа «+XXXXXXXXXXX», где X — любое целое от 0 до 9. Причём,  на месте пустых «вводов» должны присутствовать символы подчёркивания «_». При задании некорректного символа, функция должна вернуть false. Например, вызов

validPhone(«+7495»)

должен вернуть «+7495_______»


Напишите функцию daysAgo(dataObject), которая принимает объект Date и возвращает словесное описание произошедшего события — «N дн. назад». Например, если текущая дата 16.05.2020, а функция вызывается с датой соответствующей 13.05.2020, результат возврата функции должен быть «2 дн. назад». Примечание: в решениях типа momentjs указываются не только дни, но и недели, месяцы и т.д. Например, вызов функции

daysAgo(new Date((new Date()).getTime()+1000*3600*24+1000))

должен вернуть «1 день назад», а вызов

daysAgo(new Date((new Date()).getTime()+1000*3600*24*17+1000))

должен вернуть «17 дней назад»


Напишите функцию timeAgo(dataObject), которая принимает объект Date и возвращает словесное описание произошедшего события — «N T назад», где N — целое число соответствующее годам, или месяцам, или неделям, или дням, или часам. Например, вызов

timeAgo(new Date((new Date()).getTime()+1000*3600*24*365*21+1000))

должен вернуть «21 год назад»


Реализуйте метод even(), который будет определять является ли числовая величина чётной или нечётной. Для чётной метод должен возвращать 1, для нечётной — 0.

Например, в контексте кода

len n = 34;
n.even();

вызов n.even() должен вернуть 1

Примечание: эта работа на расширение прототипа встроенного объекта Number.


Расширьте встроенный конструктор массивов методом mul(n). При вызове, метод должен возвращать новый массив с элементами текущего массива, умноженными на n. Например, в контексте вызова

let d = [34,5];

d.mul(2);

Вызов метода d.mul(2) должен вернуть массив [68,10]


Создайте класс CSS, у которого будет статический метод rgb(r,g,b). Метод должен возвращать строку в формате «rgb(23,56,100)». r,g,b должны быть целыми числами от 0 до 255 (включая). Например, вызов

CSS.rgb(23,56,100)

должен вернуть ‘rgb(23,56,100)’. А вызов

CSS.rgb(323,-56,36.6)

должен вернуть ‘rgb(255,0,37)’


Создайте функцию nextNumber(arr, n), которая принимает массив arr и необязательный параметр n с номером первого элемента, который должен быть возвращен возвращаемой функцией. Например, вызов функции

const test = nextNumber([1,2,3]);
test(); //1
test(); //2
test(); //3
test(); //1
...

 

 

 

 

 

 

Практика javascript 2017 года

Задание  1: Сортировка карточек

Вам дана стопка посадочных карточек на различные виды транспорта, которые доставят вас из точки A в точку B. Карточки перепутаны, и вы не знаете, где начинается и где заканчивается ваше путешествие. Каждая карточка содержит информацию о том, откуда и куда вы едете на данном отрезке маршрута, а также о типе транспорта (номер рейса, номер места и прочее).
Предоставьте JavaScript API, который отсортирует такой список карточек и вернет словесное описание, как проделать ваше путешествие. API должен принимать на вход несортированный список карточек в формате придуманном вами и возвращать, например, такое описание:

• Take train 78A from Madrid to Barcelona. Seat 45B.
• Take the airport bus from Barcelona to Gerona Airport. No seat assignment.
• From Gerona Airport, take flight SK455 to Stockholm. Gate 45B. Seat 3A. Baggage drop at ticket counter 344.
• From Stockholm, take flight SK22 to New York JFK. Gate 22. Seat 7B. Baggage will be automatically transferred from your last leg.

Требования:

• Алгоритм должен работать с любым количеством карточек, если все карточки образуют одну неразрывную цепочку.
Время прибытия и отправления неизвестно и не важно. Подразумевается, что средство передвижения для следующего отрезка дожидается вас.
• Структура кода должна быть расширяема для использования любых типов транспорта и информации, которая может быть связана с каждым типом транспорта.
• API будет вызываться из других частей JavaScript-кода без необходимости дополнительных запросов между браузером и сервером.
• Не используйте библиотеки и фреймворки, напишите все с нуля.
Задокументируйте в коде формат входных и выходных данных.

Задание 2: Проход по дереву

Написать тело функции reversePrint(), чтобы она при вызове доходила до самого глубокого свойства next и поднимаясь выводила числа. Например, 4,3,2,1.

function reversePrint (linkedList) {
   // ...
}
 
var someList = {
    value: 1,
    next: {
        value: 2,
        next: {
            value: 3,
            next: {
                value: 4,
                next: null
            }
        }
     }
};
reversePrint(someList);

Задание 3: Сортировка массива объектов

Создайте массив объектов users. Каждый объект — элемент массива — должен иметь имя сотрудника, его возраст и рост. Отсортируйте массив по возрасту сотрудников (по свойству age объектов).

  1. изначально массив не должен быть упорядочен
  2. количество элементов не должно быть менее 5
  3. предусмотреть возможность сортировки по разным свойствам с использованием замыкания (Пример замыкания в JavaScript — https://www.youtube.com/watch?v=8JsteOQxJZc )

Задание 4: Работа с декартовыми координатами

Даны координаты трёх точек в декартовой системе. Определить какая из них ближе к четвёртой точке с координатами x,y. Примечания:

  1. координаты точек генерировать случайным образом
  2. решение должно выглядеть в виде функции
  3. формат хранения координат точек продумать самостоятельно, но не тратить на каждую ось по отдельной глобальной переменной
  4. рассмотреть вариант с трёхмерной системой координат

Задание 5: Работа со строкой

В переменной str находится текст. Написать функцию, возвращающую массив объектов, свойствами которых будут отдельные слова текста, а значениями — частота встречаемости этого слова

Задание 6: Копирование массивов 

Напишите функцию копирования многомерного массива. Примечание: используйте рекурсию.

Задание 7: Замена строк

Написать функцию myReplace(s1, s2, s3), которая будет принимать три строковых аргумента s1, s2, s3 и заменять в первом аргументе s1 все слова, совпадающие со вторым аргументом s2, на третий аргумент s3.

Задание 8: Фильтрация массива

Напишите функцию для фильтрации массива filterArr(inArr,filter), где inArr — входной одномерный массив, filter — функция принимающая по очереди каждый элемент inArr и возвращающая true, если этот элемент доложен входить в результат фильтрации или false, если элемент не должен попадать в результат.

  1. Рассмотрите варианты, когда inArr содержит (а) строки, (б) числа, (в) объекты. filter для разных случаев должна быть соответствующая.
  2. Функция filterArr(inArr,filter) должна возвращать отфильтрованный массив

Задание 9: Извлечение массива свойств

Возьмите массив, подобный массиву users из задания 3. Напишите функцию extractProps(prop), которая по значению аргумента prop вернёт массив всех одноимённых свойств из объектов массива users.

Задание 10: Числа словами

Создайте метод у всех числовых объектов, который бы выводил значение числа от 0 до 99 в виде слов. Например число 45 должно выводиться как «сорок пять». Для выполнения задания используйте свойство prototype.

Задание 11: Алгоритм Дейкстры

Реализовать алгоритм Дейкстры.