hw04_objects_json.js 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673
  1. let taskList = (`
  2. 1 3-persons
  3. 2 different fields
  4. 3 fields check
  5. 4 array of persons
  6. 5 loop of persons
  7. 6 loop of name and surname
  8. 7 loop of loop of values
  9. 8 fullName
  10. 9 serialize - JSON-строку из persons
  11. 10 deserialize
  12. 11 HTML
  13. 12 HTML optional fields
  14. 13 HTML tr color
  15. 14 HTML th optional = 13
  16. 15 Задание на синий пояс. HTML-конструктор
  17. 16 destruct array
  18. 17 destruct string
  19. 18 destruct 2
  20. 19 destruct 3
  21. 20 черный пояс - ассоциативная гадалка
  22. `)
  23. let a = {};
  24. let b = {};
  25. let c = {};
  26. let myObjArr = [a, b, c];
  27. mustHaveKeys = ["name", "surname"];
  28. function normaliseAllObjects() {
  29. for (i in myObjArr) {
  30. for (key in myObjArr[i]) {
  31. if (myObjArr[i][key] === null) { myObjArr[i][key] = '' }
  32. }
  33. }
  34. }
  35. function showAllObjects() {
  36. let strTemp = "";
  37. for (i in myObjArr) {
  38. for (key in myObjArr[i]) {
  39. strTemp += myObjArr[i][key] + " "
  40. }
  41. console.log(strTemp);
  42. strTemp = "";
  43. }
  44. // alert("Загляни в консоль...");
  45. }
  46. function hw04_json(task = +(prompt("Что? Новый хозяин! надо??? Введите номер задания:\n" + taskList, "Напечь за меня пирогов!"))) {
  47. switch (task) {
  48. case 0: { ; }; break;
  49. case 1: {
  50. // 3 persons
  51. // Сделать три ассоциативных массива a, b, c,
  52. // в каждом из которых должны быть поля name и surname.
  53. function insFullname(obj, objName, i) {
  54. obj["name"] = (prompt(`Объект ${objName}.["name"] = ?`, `Name_${i}`)) || "";
  55. obj["surname"] = (prompt(`Объект ${objName}.["surname"] = ?`, `Surname_${i}`)) || "";
  56. }
  57. let myStr = 'abc';
  58. for (i = 0; i <= 2; i++) {
  59. insFullname(myObjArr[i], myStr[i], i);
  60. }
  61. normaliseAllObjects(); // после добавления в "insFullname(obj, objName, i)" проверки ... || ""...
  62. // можно и не делать normaliseAllObjects() в этом задании
  63. console.log(a)
  64. console.log(b)
  65. console.log(c)
  66. } //case #
  67. break;
  68. case 2: {
  69. // different fields
  70. // Добавьте некоторые другие поля(например age, fathername, sex(пол)) так,
  71. // что бы набор полей отличался у разных объектов
  72. hw04_json(1);
  73. a["age"] = +prompt(`Введите age объекта "а":`, 1);
  74. a["fathername"] = prompt(`Введите fathername объекта "а":`, "FathernameA");
  75. b["fathername"] = prompt(`Введите fathername объекта "b":`, "FathernameB");
  76. b["sex"] = ((prompt(`Введите sex объекта "b": (m/w)`, "m")));
  77. c["age"] = +prompt(`Введите возраст объекта "c":`, 3);
  78. normaliseAllObjects();
  79. console.log(a)
  80. console.log(b)
  81. console.log(c)
  82. } //case #
  83. break;
  84. case 3: {
  85. // fields check
  86. // Проверьте наличие необязательных полей у каждого из этих массивов.
  87. // Если поле найдено, выведите его с помощью alert.
  88. // Проверку делайте по typeof или in в if.
  89. hw04_json(2);
  90. for (person in myObjArr) {
  91. let strTemp = "";
  92. for (keyi in myObjArr[person]) {
  93. if (!mustHaveKeys.includes(keyi)) { strTemp += keyi + ", " }
  94. }
  95. console.log(strTemp);
  96. if (strTemp !== "") {
  97. alert(`В ${person}-м обьекте такие необязательные поля: \n${strTemp}`);
  98. } else { alert(`В ${person}-м обьекте необязательных полей нет.`) }
  99. }
  100. } //case #
  101. break;
  102. case 4: {
  103. // array of persons
  104. // Добавьте несколько ассоциативных массивов с персонами в обычный массив persons,
  105. // например a, b, c.
  106. // Так же добавьте персону литерально({ ...}).
  107. // Получится обычный массив с элементами - ассоциативными массивами с персонами.
  108. hw04_json(2);
  109. myObjArr[3] = {
  110. name: "NameQ",
  111. surname: "SurnameQ",
  112. sex: "f"
  113. }
  114. console.log(myObjArr);
  115. } //case #
  116. break;
  117. case 5: {
  118. // loop of persons
  119. // Сделайте цикл, который выводит весь массив persons
  120. // в форме объектов console.log(persons[i])
  121. hw04_json(4);
  122. for (i in myObjArr) { console.log(myObjArr[i]) };
  123. alert("Загляни в консоль...");
  124. } //case #
  125. break;
  126. case 6: {
  127. // loop of name and surname
  128. // Сделайте цикл, который выводит весь массив persons,
  129. // но только Имя и Фамилию каждой персоны.
  130. hw04_json(4);
  131. let strTemp;
  132. for (i in myObjArr) {
  133. strTemp = myObjArr[i].name + " " + myObjArr[i].surname; //можно и без промежуточной
  134. console.log(strTemp); // строки сразу в консоль
  135. }
  136. alert("Загляни в консоль...");
  137. } //case #
  138. break;
  139. case 7: {
  140. // loop of loop of values
  141. // Сделайте цикл, который выводит весь массив persons,
  142. // но только значения всех полей из объектов.
  143. // Используйте вложенный цикл
  144. hw04_json(4);
  145. showAllObjects()
  146. } //case #
  147. break;
  148. case 8: {
  149. // fullName
  150. // Сделайте цикл, которых добавляет поле fullName в каждый объект,
  151. // содержащий ФИО.
  152. // Учтите, что поле fathername не является обязательным.
  153. hw04_json(4);
  154. normaliseAllObjects();
  155. for (i in myObjArr) {
  156. myObjArr[i]["fullName"] = myObjArr[i].name;
  157. if (myObjArr[i].surname !== "") { myObjArr[i]["fullName"] += " " + myObjArr[i].surname }
  158. myObjArr[i]["fullName"] += (((myObjArr[i].fathername) && (" " + myObjArr[i].fathername)) || "") // после normaliseAllObjects();
  159. } // проверка (..||"") здесь лишняя
  160. ; // но лучше "пере.." чем "недо.." ))
  161. showAllObjects();
  162. } //case #
  163. break;
  164. case 9: {
  165. // serialize
  166. // Создайте JSON - строку из persons
  167. hw04_json(8);
  168. showAllObjects();
  169. let jsonStr = JSON.stringify(myObjArr);
  170. console.log(jsonStr);
  171. } //case #
  172. break;
  173. case 10: {
  174. // deserialize
  175. // Создайте ассоциативный массив с одной персоной из JSON - строки.
  176. // Добавьте её в persons
  177. hw04_json(8);
  178. showAllObjects();
  179. let jsonStr = `{"name":"JsonName","surname":"JsonSurname","age":2020,"fullName":"JsonName JsonSurname"}`;
  180. let jsonObj = JSON.parse(jsonStr);
  181. myObjArr.push(jsonObj);
  182. console.log(myObjArr);
  183. showAllObjects();
  184. } //case #
  185. break;
  186. case 11: {
  187. // HTML
  188. // Сделайте цикл, который выводит весь массив persons в форме HTML - таблицы.
  189. // Имя и Фамилия - колонки.
  190. hw04_json(10);
  191. let strHtml = `<table border="1" align="center">`;
  192. strHtml += `<tr><td>name</td><td>surname</td></tr>`;
  193. for (i in myObjArr) {
  194. strHtml += `<tr><td>${(myObjArr[i].name) || ""}</td><td>${(myObjArr[i].surname) || ""}</td></tr>`;
  195. };
  196. strHtml += `</table>`;
  197. document.write(strHtml);
  198. } //case #
  199. break;
  200. case 12: {
  201. // HTML optional fields
  202. // Сделайте цикл, который выводит весь массив persons, в форме HTML - таблицы.
  203. // Имя и Фамилия, а так же другие поля при наличии.
  204. // Колонки: поля, строки таблицы - персоны.
  205. hw04_json(10);
  206. // создаем массив всех ключей из всех объектов без повторений
  207. let arrOfKeys = [];
  208. for (i in myObjArr) {
  209. for (key in myObjArr[i]) {
  210. if (!(arrOfKeys.includes(key))) { arrOfKeys.push(key) };
  211. }
  212. } //---------------
  213. // первая строка с именами колонок
  214. let strHtml = `<table border="1" align="center"><tr>`;
  215. for (i in arrOfKeys) { strHtml += `<td>${arrOfKeys[i]}</td>`; };
  216. strHtml += `</tr>`;
  217. for (i in myObjArr) {
  218. strHtml += `<tr>`;
  219. for (key in arrOfKeys) {
  220. strHtml += `<td>`;
  221. if (arrOfKeys[key] in myObjArr[i]) { strHtml += myObjArr[i][arrOfKeys[key]] };
  222. strHtml += `</td>`;
  223. };
  224. strHtml += `</tr>`;
  225. }
  226. strHtml += `</table>`;
  227. document.write(strHtml);
  228. } //case #
  229. break;
  230. case 13: {
  231. // HTML tr color
  232. // Добавьте к предыдущему примеру раскраску через строчку
  233. // используя другой стиль тэга tr.
  234. hw04_json(10);
  235. // создаем массив всех ключей из всех объектов без повторений
  236. let arrOfKeys = [];
  237. for (i in myObjArr) {
  238. for (key in myObjArr[i]) {
  239. if (!(arrOfKeys.includes(key))) { arrOfKeys.push(key) };
  240. }
  241. } //---------------
  242. // первая строка с именами колонок
  243. let strHtml = `<table border="1" align="center"><tr bgcolor="#42ecff">`;
  244. for (i in arrOfKeys) { strHtml += `<th>${arrOfKeys[i]}</th>`; };
  245. strHtml += `</tr>`;
  246. let colorGray = true;
  247. for (i in myObjArr) {
  248. colorGray = !colorGray;
  249. if (colorGray) { strHtml += `<tr bgcolor="#B0B0B0">`; } else { strHtml += `<tr>`; };
  250. for (key in arrOfKeys) {
  251. strHtml += `<td>`;
  252. if (arrOfKeys[key] in myObjArr[i]) { strHtml += myObjArr[i][arrOfKeys[key]] };
  253. strHtml += `</td>`;
  254. };
  255. strHtml += `</tr>`;
  256. }
  257. strHtml += `</table>`;
  258. document.write(strHtml);
  259. } //case #
  260. break;
  261. case 14: {
  262. // HTML th optional
  263. // Переработайте вывод persons в HTML с поиском всех возможных колонок во всех записях,
  264. // выводом названий колонок в заголовок HTML - таблицы.
  265. // Для решения этой задачи вначале узнайте множество полей(ключей) во всех записях(они не совпадают),
  266. // выведите HTML - заголовок используя тэги < th >, а потом выводите все записи.
  267. // Ниже выведите все персоны построчно.Следите за корректностью колонок.
  268. // Для этого вам нужно итерировать общий набор колонок, а не каждую персону,
  269. // колонки из которой могут отличаться от предыдущей.
  270. // Я это уже сделал в 13 пункте
  271. hw04_json(13);
  272. ;
  273. } //case #
  274. break;
  275. case 15: {
  276. // Задание на синий пояс.
  277. // Сделать HTML - конструктор из деревянной структуры, которая была на прошлом занятии:
  278. let someTree = {
  279. tagName: "table", //html tag
  280. subTags: [ //вложенные тэги
  281. {
  282. tagName: "tr",
  283. subTags: [
  284. {
  285. tagName: "td",
  286. text: "some text",
  287. },
  288. {
  289. tagName: "td",
  290. text: "some text 2",
  291. attrs:
  292. {
  293. bgcolor: "red"
  294. }
  295. },
  296. {
  297. tagName: "th",
  298. text: "some text right1",
  299. attrs:
  300. {
  301. bgcolor: "gray"
  302. }
  303. },
  304. ]
  305. },
  306. {
  307. tagName: "tr",
  308. subTags: [
  309. {
  310. tagName: "td",
  311. text: "some text 3",
  312. },
  313. {
  314. tagName: "td",
  315. text: "some text 4",
  316. },
  317. {
  318. tagName: "td",
  319. text: "some text right 2",
  320. },
  321. ],
  322. attrs:
  323. {
  324. bgcolor: "#42ecff",
  325. },
  326. },
  327. {
  328. tagName: "tr",
  329. subTags: [
  330. {
  331. tagName: "td",
  332. text: "some text 5",
  333. },
  334. {
  335. tagName: "td",
  336. text: "some text 6",
  337. },
  338. {
  339. tagName: "td",
  340. text: "some text right 3",
  341. },
  342. ],
  343. attrs:
  344. {
  345. bgcolor: "#00FF00",
  346. },
  347. },
  348. ],
  349. attrs:
  350. {
  351. border: 1,
  352. align: "center",
  353. },
  354. };
  355. // функция для конструкции таблиц (и не только таблиц)
  356. // с любым числом колонок и строк
  357. // с любым набором атрибутов
  358. function tableConstructor(item) {
  359. str += "<" + item.tagName;
  360. if ("attrs" in item) {
  361. for (attrKey in item.attrs) {
  362. str += " " + attrKey + `="` + item.attrs[attrKey] + `"`;
  363. }
  364. }
  365. str += ">";
  366. if ("subTags" in item) {
  367. for (i in item.subTags) { tableConstructor(item.subTags[i]); }
  368. };
  369. if ("text" in item) {
  370. str += item.text;
  371. };
  372. str += "</" + item.tagName + ">";
  373. ;
  374. }; //function tableConstructor
  375. let str = ""
  376. tableConstructor(someTree);
  377. console.log(someTree);
  378. console.log(str);
  379. document.write(str);
  380. ;
  381. } //case #
  382. break;
  383. case 16: {
  384. // destruct array
  385. // напишите код, который используя деструктуризацию положит:
  386. // четные числа в переменные even1, even2,
  387. // нечетные в odd1, odd2, odd3,
  388. // буквы в отдельный массив
  389. let arr = [1, 2, 3, 4, 5, "a", "b", "c"];
  390. console.log(arr);
  391. let [odd1, even1, odd2, even2, odd3, ...charArr] = arr;
  392. console.log(odd1);
  393. console.log(odd2);
  394. console.log(odd3);
  395. console.log(even1);
  396. console.log(even2);
  397. console.log(charArr);
  398. ;
  399. } //case #
  400. break;
  401. case 17: {
  402. // destruct string
  403. // напишите код, который используя деструктуризацию положит:
  404. // число в переменную number
  405. // букву a в переменную s1
  406. // букву b в переменную s2
  407. // букву c в переменную s3
  408. let arr = [1, "abc"];
  409. console.log(arr);
  410. let [number, [s1, s2, s3]] = arr;
  411. console.log("number " + number);
  412. console.log("s1 " + s1);
  413. console.log("s2 " + s2);
  414. console.log("s3 " + s3);
  415. ;
  416. } //case #
  417. break;
  418. case 18: {
  419. // destruct 2
  420. // извлеките используя деструктуризацию имена детей в переменные name1 и name2
  421. let obj = {
  422. name: 'Ivan',
  423. surname: 'Petrov',
  424. children: [{ name: 'Maria' }, { name: 'Nikolay' }]
  425. }
  426. // let { children } = obj;
  427. // let [{ name: name1 }, { name: name2 }] = children;
  428. let { children: [{ name: name1 }, { name: name2 }] } = obj;
  429. console.log(obj);
  430. console.log(`name1 - ${name1} name2 - ${name2}`);
  431. ;
  432. } //case #
  433. break;
  434. case 19: {
  435. // desctruct 3
  436. // let arr = [1, 2, 3, 4, 5, 6, 7, 10]
  437. // извлеките используя деструктуризацию объектов два первых элемента
  438. // и длину массива в переменные a, b и length
  439. let arr = [77, 25, 3, 4, 5, 6, 7, 10];
  440. console.log(arr);
  441. let { length: length, [0]: a, [1]: b, } = arr;
  442. console.log('length ' + length);
  443. console.log('a ' + a);
  444. console.log('b ' + b);
  445. ;
  446. } //case #
  447. break;
  448. case 20: {
  449. // Задание на черный пояс
  450. // Сделать предыдущее задание на черный пояс в упрощенном виде:
  451. // не использовать четырехмерный массив для хранения истории,
  452. // а использовать ассоциативный массив:
  453. // Например, если пользователь ввел 1212 за последние четыре хода,
  454. // то мы ищем то, что было введено последний раз после такой последовательности:
  455. // var history = "1212"
  456. // var predictValue = predictArray[history] // в predictValue то, что ввел последний раз пользователь после нажатий 1212
  457. // var newValue = prompt("введите 1 или 2", "");
  458. // predictArray[history] = newValue //сохраняем новый ввод
  459. // //сдвигаем историю
  460. // не верно понял задание и алгоритм - надо переделать
  461. let history = ["1", "2", "1", "2"];
  462. let predictArray = [];
  463. let predictValue = {};
  464. let yourMove = '1';
  465. do {
  466. predictValue = predictArray[history];
  467. console.log(`Я предсказываю - ${predictValue}`);
  468. yourMove = prompt(`твое число 1 или 2 ?`)
  469. if (predictValue === yourMove) { alert('BINGO!!!') } else { alert(`Uuuups...`) };
  470. predictArray[history] = yourMove;
  471. history.push(yourMove);
  472. history.shift();
  473. } while (yourMove);
  474. // ---------РАБОТАЕТ но по неправильному алгоритму --------------------
  475. // ---------сравнивает не последовательность четырех ходов, а ищет последний такой же ход
  476. // сделаем чуть по другому :
  477. // будем хранить не истоию из четырех вводов, а всю историю
  478. // на сколько это позволит RAM
  479. // почти самообучающаяся гадалка
  480. // let predictArray = {};
  481. // let newValue = myPredict = "";
  482. // let history = prompt(`\nВведите 1-й свой вариант без моих предсказаний:`);
  483. // do { // while
  484. // myPredict = "Не могу предсказать...";
  485. // for (key in predictArray) {
  486. // if (key === history) {
  487. // (myPredict = predictArray[history]);
  488. // break;
  489. // }
  490. // }
  491. // //if (!(Object.keys(predictArray).length)) myPredict = "Не могу предсказать... ((";
  492. // console.log(history + " Мне кажется это будет - ... " + myPredict);
  493. // newValue = prompt(`\nВаш новый вариант?`)
  494. // if (myPredict !== "Не могу предсказать...") {
  495. // if (myPredict === newValue) {
  496. // myPredict += " - ТЫ ПРЕДСКАЗУЕМ !!!";
  497. // } else {
  498. // myPredict = "Мне казалось, что это будет ... " + myPredict;
  499. // }
  500. // }
  501. // alert(`\n${myPredict}`);
  502. // predictArray[history] = newValue; // можно и массив объектов организовать и push-ить туда новые значения
  503. // // но тогда надо переписать цикл перебора истории, а он уже есть и работает
  504. // history = newValue;
  505. // } while (newValue);
  506. ;
  507. } //case #
  508. break;
  509. default: { alert("Такого мы еще не умеем...!!!") };
  510. }
  511. }