index.js 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572
  1. //Literals
  2. //Найдите несколько окружающих объектов реального мира и создайте соответственные объекты Javascript. Например:
  3. {
  4. const phone = {
  5. brand: 'Xiaomi',
  6. model: 'mi11',
  7. year: '2021',
  8. memory: '256'
  9. }
  10. }
  11. //Literals expand
  12. //Дайте возможность пользователю добавить любые два свойства в эти объекты с любыми значениями. Обеспечьте ввод названия ключа и значения через prompt прямо в литерале объекта {}
  13. {
  14. const yourPhone = {
  15. [prompt('свойство 1')]: prompt('значение свойства 1'),
  16. [prompt('свойство 2')]: prompt('значение свойства 2'),
  17. [prompt('свойство 3')]: prompt('значение свойства 3'),
  18. }
  19. }
  20. //Literals copy
  21. //Пусть пользователь введет еще одно свойство в переменную. Вставьте в новый объект эту переменную. Скопируйте объект из предыдущего задания в новый объект.
  22. {
  23. const yourPhone = {
  24. [prompt('свойство 1')]: prompt('значение свойства 1'),
  25. [prompt('свойство 2')]: prompt('значение свойства 2'),
  26. }
  27. const property = prompt()
  28. const objNew = {
  29. [property] : 25,
  30. ...yourPhone
  31. }
  32. }
  33. //Html tree
  34. /*
  35. <body>
  36. <div>
  37. <span>Enter a data please:</span><br/>
  38. <input type='text' id='name'>
  39. <input type='text' id='surname'>
  40. </div>
  41. <div>
  42. <button id='ok'>OK</button>
  43. <button id='cancel'>Cancel</button>
  44. </div>
  45. </body>
  46. */
  47. /*Сделайте декларативную JSON-структуру для тэгов выше, в которой:
  48. каждый тэг будет объектом
  49. имя тэга будет полем tagName
  50. вложенные тэги будут в поле children
  51. набор аттрибутов тэга будет в поле attrs.*/
  52. {
  53. const body = {
  54. tagName : 'body',
  55. children : [
  56. {
  57. tagName : 'div',
  58. children : [
  59. {
  60. tagName : 'span',
  61. children : ['Enter a data please:']
  62. },
  63. {
  64. tagName : 'br'
  65. },
  66. {
  67. tagName : 'input',
  68. attrs : {
  69. type : 'text',
  70. id : 'name'
  71. }
  72. },
  73. {
  74. tagName : 'input',
  75. attrs : {
  76. type : 'text',
  77. id : 'surname',
  78. }
  79. }
  80. ]
  81. },
  82. {
  83. tagName : 'div',
  84. children : [
  85. {
  86. tagName : 'button',
  87. attrs : {
  88. id : 'ok'
  89. },
  90. children : ['OK']
  91. },
  92. {
  93. tagName : 'button',
  94. attrs : {
  95. id : 'cancel'
  96. },
  97. children : 'Cancel'
  98. },
  99. ]
  100. }
  101. ]
  102. }
  103. // Выведите значения текста во второй кнопке, используя . и [].
  104. console.log( body.children[1].children[1].children ) ;
  105. //Выведите значение атрибута id во втором input, используя . и [].
  106. console.log( body.children[0].children[3].attrs.id ) ;
  107. }
  108. // Parent
  109. // Добавьте каждому объекту тэга из предыдущего задания связь с родителем, используя свойство parent и присвоение
  110. {
  111. const body = {
  112. tagName : 'body',
  113. children : [
  114. {
  115. tagName : 'div',
  116. children : [
  117. {
  118. tagName : 'span',
  119. children : ['Enter a data please:']
  120. },
  121. {
  122. tagName : 'br'
  123. },
  124. {
  125. tagName : 'input',
  126. attrs : {
  127. type : 'text',
  128. id : 'name'
  129. }
  130. },
  131. {
  132. tagName : 'input',
  133. attrs : {
  134. type : 'text',
  135. id : 'surname',
  136. }
  137. }
  138. ]
  139. },
  140. {
  141. tagName : 'div',
  142. children : [
  143. {
  144. tagName : 'button',
  145. attrs : {
  146. id : 'ok'
  147. },
  148. children : ['OK']
  149. },
  150. {
  151. tagName : 'button',
  152. attrs : {
  153. id : 'cancel'
  154. },
  155. children : 'Cancel'
  156. },
  157. ]
  158. }
  159. ]
  160. }
  161. body.children[0].parent = body;
  162. body.children[0].children[0].parent = body.children[0];
  163. body.children[0].children[1].parent = body.children[0];
  164. body.children[0].children[2].parent = body.children[0];
  165. body.children[0].children[3].parent = body.children[0];
  166. body.children[1].parent = body;
  167. body.children[1].children[0].parent = body.children[1];
  168. body.children[1].children[1].parent = body.children[1];
  169. }
  170. //Change OK
  171. //Добавьте(или измените) любой введенный пользователем атрибут тэга <button id='ok'> из задания HTML Tree. Пользователь также вводит значение этого атрибута.
  172. {
  173. const body = {
  174. tagName : 'body',
  175. children : [
  176. {
  177. tagName : 'div',
  178. children : [
  179. {
  180. tagName : 'span',
  181. children : ['Enter a data please:']
  182. },
  183. {
  184. tagName : 'br'
  185. },
  186. {
  187. tagName : 'input',
  188. attrs : {
  189. type : 'text',
  190. id : 'name'
  191. }
  192. },
  193. {
  194. tagName : 'input',
  195. attrs : {
  196. type : 'text',
  197. id : 'surname',
  198. }
  199. }
  200. ]
  201. },
  202. {
  203. tagName : 'div',
  204. children : [
  205. {
  206. tagName : 'button',
  207. attrs : {
  208. id : 'ok'
  209. },
  210. children : ['OK']
  211. },
  212. {
  213. tagName : 'button',
  214. attrs : {
  215. id : 'cancel'
  216. },
  217. children : 'Cancel'
  218. },
  219. ]
  220. }
  221. ]
  222. }
  223. body.children[0].parent = body;
  224. body.children[0].children[0].parent = body.children[0];
  225. body.children[0].children[1].parent = body.children[0];
  226. body.children[0].children[2].parent = body.children[0];
  227. body.children[0].children[3].parent = body.children[0];
  228. body.children[1].parent = body;
  229. body.children[1].children[0].parent = body.children[1];
  230. body.children[1].children[1].parent = body.children[1];
  231. const buttonIdOk = prompt("введите атрибут <button id='ok'> кторый хотите добавить или изменить");
  232. const buttonIdOkValue = prompt("введите значение атрибута " + buttonIdOk);
  233. body.children[1].children[0].attrs[buttonIdOk] = buttonIdOkValue
  234. //Destructure
  235. //Используя деструктуризацию структуры из задания HTML Tree, Выведите значения текста в тэге span, Выведите значения текста во второй кнопке и Выведите значение атрибута id во втором input.
  236. const {children : [
  237. {children : [
  238. {children:[span]},
  239. {},
  240. {},
  241. {attrs :{id:id}}
  242. ]},
  243. {children : [
  244. {},
  245. {children : button2}
  246. ]}
  247. ]} = body
  248. console.log(span, button2, id)
  249. }
  250. //Destruct array
  251. /*let arr = [1,2,3,4,5, "a", "b", "c"]
  252. напишите код, который используя деструктуризацию положит:
  253. четные числа в переменные even1, even2,
  254. нечетные в odd1, odd2, odd3,
  255. буквы в отдельный массив */
  256. {
  257. let arr = [1,2,3,4,5, "a", "b", "c"];
  258. const [odd1, even1, odd2, even2, odd3, ...Literals] = arr
  259. }
  260. //Destruct string
  261. /*let arr = [1, "abc"]
  262. напишите код, который используя деструктуризацию положит:
  263. число в переменную number
  264. букву a в переменную s1
  265. букву b в переменную s2
  266. букву c в переменную s3*/
  267. {
  268. let arr = [1, "abc"]
  269. const [number, [s1, s2, s3]] = arr
  270. }
  271. /*Destruct 2
  272. let obj = {name: 'Ivan',
  273. surname: 'Petrov',
  274. children: [{name: 'Maria'}, {name: 'Nikolay'}]}
  275. извлеките используя деструктуризацию имена детей в переменные name1 и name2*/
  276. {
  277. let obj = {name: 'Ivan',
  278. surname: 'Petrov',
  279. children: [{name: 'Maria'}, {name: 'Nikolay'}]}
  280. let {children:[{name: name1},{name: name2}]} = obj
  281. }
  282. /*Destruct 3
  283. let arr = [1,2,3,4, 5,6,7,10]
  284. извлеките используя деструктуризацию объектов два первых элемента и длину массива в переменные a, b и length*/
  285. {
  286. let arr = [1,2,3,4, 5,6,7,10];
  287. let {1 : a,
  288. 2 : b,
  289. length : length} = arr;
  290. }
  291. /*Copy delete
  292. Сделайте копию одного из объектов из задания Literals без ключа, который введет пользователь.*/
  293. {
  294. const phone = {
  295. brand: 'Xiaomi',
  296. model: 'mi11',
  297. year: '2021',
  298. memory: '256'
  299. }
  300. const newObj = {...phone}
  301. }
  302. /*Currency real rate
  303. Ниже приведен код, который скачивает актуальную информацию о курсах валют. Скопируйте ссылку из него вставьте в браузер интереса ради. Реализуйте калькулятор обмена валют следующим образом:
  304. Пользователь вводит исходную валюту
  305. Пользователь вводит валюту, в которую происходит конвертация
  306. Пользователь вводит сумму в исходной валюте
  307. Пользовател видит результат конвертации*/
  308. {
  309. let currencyStart = prompt('Пользователь вводит исходную валюту').toUpperCase();
  310. let currencyFinish = prompt('Пользователь вводит валюту, в которую происходит конвертация').toUpperCase();
  311. let summStart = +prompt('Пользователь вводит сумму в исходной валюте');
  312. let rateStart
  313. let rateFinish
  314. fetch('https://open.er-api.com/v6/latest/USD').then(res => res.json())
  315. .then(data => {
  316. //эта функция запускается когда данные скачиваются.
  317. //остальной код работает РАНЬШЕ.
  318. //только ТУТ есть переменная data со скачанными данными
  319. console.log(data) //изучите структуру, получаемую с сервера в консоли
  320. rateStart = data.rates[currencyStart];
  321. console.log('rateStart' + rateStart);
  322. rateFinish = data.rates[currencyFinish];
  323. console.log('rateFinish' + rateFinish);
  324. summStart / rateStart * rateFinish ? alert(summStart / rateStart * rateFinish) : alert('вы ввели какую -то дичь!')
  325. })
  326. }
  327. /*Учтите, что пользователь может ввести какую-то дичь или название валют в неверном регистре*/
  328. //Currency drop down
  329. //Сделайте выпадающий список с названиями всех валют, используя код из прошлого задания и накопление HTML-тэгов в строковой переменной. Для выпадающих списков в HTML предусмотрены тэги <select> и <option>
  330. {
  331. fetch('https://open.er-api.com/v6/latest/USD').then(res => res.json())
  332. .then(data => {
  333. console.log(data)
  334. let select = '<select>'
  335. for (let currency in data.rates){
  336. select += '<option>' + currency + '</option>'
  337. }
  338. select += '</select>'
  339. document.write(select)
  340. })
  341. }
  342. /*Currency table
  343. Сделайте двумерную таблицу с курсами между всеми возможными парами валют по типу таблицы Пифагора, используя заготовку из задания Currency real rate:
  344. Используйте только один запрос на сервер. Используйте расчет кросскурса для вычисления курса между любой парой валют*/
  345. {
  346. fetch('https://open.er-api.com/v6/latest/USD').then(res => res.json())
  347. .then(data => {
  348. let table = '<table>'
  349. table += '<tr><td></td>'
  350. for (let currency in data.rates){
  351. table += '<td>' + currency + '</td>'
  352. }
  353. table += '</tr>'
  354. for (let currencyStart in data.rates){
  355. table += '<tr><td>' + currencyStart + '</td>';
  356. for (let currencyFinish in data.rates) {
  357. table += `<td>${data.rates[currencyFinish] / data.rates[currencyStart]}</td>`
  358. }
  359. }
  360. table += '</table>'
  361. document.write(table)
  362. })
  363. }
  364. /*Form
  365. Напишите код, который их любого объекта создает форму HTML. Например для такого объекта:
  366. const car = {
  367. "Name":"chevrolet chevelle malibu",
  368. "Cylinders":8,
  369. "Displacement":307,
  370. "Horsepower":130,
  371. "Weight_in_lbs":3504,
  372. "Origin":"USA",
  373. "in_production": false
  374. }
  375. На экране должна появиться форма из 7 строк, с названиями полей, взятыми из ключей и полями ввода соответствующих типов. Значениями полей ввода должны быть значения из объекта.
  376. <form>
  377. <label>Name: <input type="text" value="chevrolet chevelle malibu"/></label>
  378. <label>Cylinders: <input type="number" value="8"/></label>
  379. <label>Displacement: <input type="number" value="307"/></label>
  380. <label>Horsepower: <input type="number" value="130"/></label>
  381. <label>Weight_in_lbs: <input type="number" value="3504"/></label>
  382. <label>Origin: <input type="text" value="USA"/></label>
  383. <label>in_production: <input type="checkbox" /></label>
  384. </form>
  385. Для создания правильного типа тэга input используйте оператор typeof Javascript:
  386. console.log(typeof 5)//number
  387. console.log(typeof "5") //string
  388. console.log(typeof (5 > 2)) //boolean
  389. Соответствие типов
  390. JS HTML
  391. number number
  392. string text
  393. boolean checkbox*/
  394. {
  395. const car = {
  396. "Name":"chevrolet chevelle malibu",
  397. "Cylinders":8,
  398. "Displacement":307,
  399. "Horsepower":130,
  400. "Weight_in_lbs":3504,
  401. "Origin":"USA",
  402. "in_production": false
  403. }
  404. let form = '<form>'
  405. for (let label in car){
  406. form += '<label>' + label +':';
  407. let type = typeof car[label];
  408. let typeHtml
  409. if (type === "number") typeHtml = "number";
  410. if (type === "string") typeHtml = "text";
  411. if (type === "boolean") typeHtml = "checkbox";
  412. form += `<input type="${typeHtml}" value="${car[label]}"/>`
  413. form += '</label>';
  414. }
  415. document.write(form)
  416. }
  417. //Table
  418. /*
  419. Даден любой массив с объектами
  420. const persons = [
  421. {
  422. name: 'Мария',
  423. fatherName: 'Ивановна',
  424. surname: 'Иванова',
  425. sex: 'female'
  426. },
  427. {
  428. name: 'Николай',
  429. fatherName: 'Иванович',
  430. surname: 'Иванов',
  431. age: 15
  432. },
  433. {
  434. name: 'Петр',
  435. fatherName: 'Иванович',
  436. surname: 'Иванов',
  437. married: true
  438. },
  439. ]
  440. Сформировать таблицу (используя накопление тэгов HTML в строке):
  441. name fatherName surname sex age married
  442. Мария Ивановна Иванова female
  443. Николай Иванович Иванов 15
  444. Петр Иванович Иванов true
  445. Алгоритм решения
  446. Перед непосредственно формированием строк таблицы надо знать все колонки. Для этого нужно предварительно перебрать все объекты и извлечь из них все ключи, что бы сформировать общее множество ключей.
  447. Первый проход - поиск колонок
  448. Перебираем массив объектов, перебираем ключи каждого объекта и добавляем в массив колонок, если этого ключа еще там нет. Для примера выше массив получится в шесть элементов. На этом этапе строку HTML создавать еще рано.
  449. Заголовок
  450. Начинаем создание таблицы. Используя массив колонок формируем одну строку таблицы с заголовками
  451. Второй проход - отображение таблицы
  452. Перебираем массив объектов, перебираем массив колонок для каждого объекта, и используем название колонки как ключ*/
  453. {
  454. const persons = [
  455. {
  456. name: 'Мария',
  457. fatherName: 'Ивановна',
  458. surname: 'Иванова',
  459. sex: 'female'
  460. },
  461. {
  462. name: 'Николай',
  463. fatherName: 'Иванович',
  464. surname: 'Иванов',
  465. age: 15
  466. },
  467. {
  468. name: 'Петр',
  469. fatherName: 'Иванович',
  470. surname: 'Иванов',
  471. married: true
  472. },
  473. ]
  474. let arrColumn = [];
  475. for ( let obj of persons){
  476. for (let key in obj ){
  477. if ( !(arrColumn.includes(key)) ) {arrColumn.push(key)}
  478. }
  479. }
  480. let table = '<table>';
  481. table += '<tr>'
  482. for (let th of arrColumn){
  483. table += '<th>' + th + '</th>'
  484. }
  485. table += '</tr>'
  486. for ( let obj of persons) {
  487. table += '<tr>';
  488. for (column of arrColumn){
  489. table += '<td>'
  490. if (obj[column]) { table += obj[column] }
  491. table += '</td>'
  492. }
  493. table += '</tr>';
  494. }
  495. table += '</table>'
  496. document.write(table)
  497. }