script.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334
  1. //Домашнее задание: Ассоциативные массивы
  2. //3 persons
  3. //Сделать три ассоциативных массива a, b, c, в каждом из которых должны быть поля name и surname.
  4. let a = {
  5. name: "Serg",
  6. surname: "Stepanov",
  7. }
  8. let b = {
  9. name: "Semen",
  10. surname: "Ivanovv",
  11. }
  12. let c = {
  13. name: "Maxim",
  14. surname: "Petrenko",
  15. }
  16. //different fields
  17. a.age = 25;
  18. b.sex = 'men';
  19. c.fatherName = 'Viktorovich';
  20. console.log(a, b, c);
  21. //fields check
  22. //("fatherName" in c)? alert(alert(c["fatherName"])): alert('not found');
  23. /* function getOptionalKey(obj) {
  24. for (let key in obj){
  25. if (key !== 'surname' && key !== 'name' ) {
  26. alert( `${key} : ${obj[key]} `);
  27. }
  28. }
  29. }
  30. getOptionalKey(a);
  31. getOptionalKey(b);
  32. getOptionalKey(c); */
  33. //or
  34. /* function getKey(obj, keyToFind) {
  35. for (let key in obj){
  36. if (key === keyToFind) {
  37. alert(obj[key]);
  38. }
  39. }
  40. }
  41. getKey(a, 'age');
  42. getKey(b, 'sex');
  43. getKey(c, 'fatherName'); */
  44. //array of persons
  45. let persons = [a, b, c, {name : 'oleg', surname: "Pavlov"}];
  46. console.log(persons);
  47. //loop of persons Сделайте цикл, который выводит весь массив persons в форме объектов console.log(persons[i])
  48. for (let index in persons) {
  49. console.log(persons[index]);
  50. }
  51. //loop of name and surname
  52. for (let i in persons) {
  53. console.log(`${persons[i].name} ${persons[i].surname} `);
  54. }
  55. //loop of loop of values
  56. for (let objct of persons) {
  57. for(let key in objct){
  58. console.log(`${objct[key]}`);
  59. }
  60. }
  61. //fullName Сделайте цикл, которых добавляет поле fullName в каждый объект,
  62. //содержащий ФИО. Учтите, что поле fathername не является обязательным.
  63. for (let objct of persons) {
  64. if("fatherName" in objct){
  65. objct.fullName = `${objct.name} ${objct.surname} ${objct.fatherName}`;
  66. } else {
  67. objct.fullName = `${objct.name} ${objct.surname}`;
  68. }
  69. }
  70. console.log(a, b, c);
  71. //serialize Создайте JSON-строку из persons
  72. let jsonFromArr = JSON.stringify(persons);
  73. console.log(jsonFromArr);
  74. //deserialize Создайте ассоциативный массив с одной персоной из JSON-строки. Добавьте её в persons
  75. let objFromJson =JSON.parse(jsonFromArr)[0];
  76. console.log(objFromJson);
  77. persons.push(objFromJson);
  78. //console.log(persons);
  79. //HTML
  80. /* let str = "<table border='1'>"
  81. for (let i in persons) {
  82. str += `<tr><td>${persons[i].name}</td>
  83. <td>${persons[i].surname}</td></tr>`;
  84. }
  85. str += "</table>"
  86. document.write(str) */
  87. //HTML optional fields
  88. /*
  89. Сделайте цикл, который выводит весь массив persons, в форме HTML-таблицы.
  90. Имя и Фамилия, а так же другие поля при наличии. Колонки: строки таблицы поля, - персоны. */
  91. let str = "<table border='1'>";
  92. //th name surname
  93. for (let i in persons) {
  94. if (i%2){
  95. str += `<tr>`;
  96. } else {
  97. str += `<tr class='tr'>`; //HTML tr color
  98. }
  99. str += `<td>${Object.keys(persons[i])[i]}</td>`
  100. for (let k of Object.values(persons)){
  101. if (Object.values(k)[i]){
  102. str += `<td>${Object.values(k)[i]}</td>`;
  103. } else {
  104. str += `<td>****${persons[i][k]}****</td>`;
  105. }
  106. }
  107. str += `</tr>`;
  108. }
  109. str += "</table>";
  110. document.write(str);
  111. //Задание на синий пояс.
  112. let body = {
  113. tagName: 'div',
  114. children: [{
  115. tagName: 'div',
  116. children: [{
  117. tagNAme: 'span',
  118. children: 'Enter a data please:'
  119. },
  120. {
  121. tagNAme: 'br'
  122. },
  123. {
  124. tagNAme: 'input',
  125. attributs: {
  126. type: 'text',
  127. id: 'text'
  128. }
  129. },
  130. {
  131. tagNAme: 'input',
  132. attributs: {
  133. type: 'text',
  134. id: 'surname'
  135. }
  136. }
  137. ]},
  138. {
  139. tagName: 'div',
  140. children: [{
  141. tagNAme: 'button',
  142. children: 'OK',
  143. attributs: {
  144. id: 'ok'
  145. }
  146. },
  147. {
  148. tagNAme: 'button',
  149. children: 'Cancel',
  150. attributs: {
  151. id: 'cancel'
  152. }
  153. }]
  154. }
  155. ]
  156. }
  157. let someTree = {
  158. tagName: "table",
  159. children: [
  160. {
  161. tagName: "tr",
  162. children: [
  163. {
  164. tagName: "td",
  165. text: "some text",
  166. },
  167. {
  168. tagName: "td",
  169. text: "some text 2",
  170. }
  171. ]
  172. }
  173. ],
  174. attributs:
  175. {
  176. border: 1,
  177. },
  178. }
  179. //console.log(body);
  180. function htmlConstructor (obj) {
  181. let {tagName, children, attributs, text} = obj;
  182. let body = `<${tagName} ${Object.keys(attributs)}=${Object.values(attributs)}>`;
  183. body = `<${tagName}>`;
  184. if (children) {
  185. for (let key of children){
  186. let {tagName, children, attributs, text} = key;
  187. body += `<${tagName}>`;
  188. //htmlConstructor (obj)
  189. if (children) {
  190. for (let key of children){
  191. let {tagName, children, attributs, text} = key;
  192. body += `<${tagName}>`;
  193. body +=`${text}`
  194. body += `</${tagName}>`;
  195. }
  196. }
  197. body += `</${tagName}>`
  198. }
  199. }
  200. body +=`</${tagName}>`
  201. console.log(body);
  202. document.write(body);
  203. };
  204. //htmlConstructor (body);
  205. htmlConstructor (someTree);
  206. //destruct array
  207. let arr = [1,2,3,4,5, "a", "b", "c"];
  208. let [,even1,,even2] = arr;
  209. let [odd1, ,odd2, ,odd3] = arr;
  210. let [,,,,,...arrLeters] = arr;
  211. console.log(even2,even1);
  212. console.log(odd1,odd2,odd3);
  213. console.log(arrLeters);
  214. //destruct string
  215. let arr1 = [1, "abc"];
  216. let [number] = arr1;
  217. let [s1,s2,s3] = arr1[1];
  218. console.log(number);
  219. console.log(s1,s2,s3);
  220. //destruct 2
  221. let obj7 = {name: 'Ivan',
  222. surname: 'Petrov',
  223. children: [{name: 'Maria'}, {name: 'Nikolay'}]};
  224. let {name: name1} = obj7.children[0];
  225. let {name: name2} = obj7.children[1];
  226. console.log(name2);
  227. //destruct 3
  228. let arr99 = [1,2,3,4,5,6,7,10];
  229. let length = arr99.length;
  230. let [a1, b1] = arr99;
  231. console.log(length);
  232. console.log(a1);
  233. console.log(b1);
  234. //Задание на черный пояс
  235. /* Сделать предыдущее задание на черный пояс в упрощенном виде:
  236. не использовать четырехмерный массив для хранения истории,
  237. а использовать ассоциативный массив: Например,
  238. если пользователь ввел 1212 за последние четыре хода,
  239. то мы ищем то, что было введено последний раз после такой последовательности:
  240. var history = "1212"
  241. var predictValue = predictArray[history] // в predictValue то, что ввел последний раз пользователь после нажатий 1212
  242. var newValue = prompt("введите 1 или 2","");
  243. predictArray[history] = newValue
  244. //сохраняем новый ввод */
  245. //сдвигаем историю
  246. /* Как это работает?
  247. Гадалка хранит историю ввода (4 последних числа) пользователя в массиве history.
  248. Каждое следующее число добавляется с помощью push в конец массива, при этом первое число из массива (самое старое) удаляется с помощью shift.
  249. Гадалка запоминает что пользователь ввёл в предыдущий раз после такой истории.
  250. То есть, если пользователь вводил 0,1,0,1,0, то логично предположить, что с историей 0,1,0,1 следующим вариантом будет 0. Для хранения используется 4х мерный массив, индексами которого является история:
  251. predictArray[history[0]][history[1]][history[2]][history[3]] равно тому,
  252. что пользователь ввёл после истории в предыдущий раз.
  253. Алгоритм:
  254. Изначально predictArray содержит, например, -1, или иные значения, которые отличаются от пользовательского ввода. История пусть состоит из единиц: history = [1,1,1,1];, Т. е. считается что пользователь нажимал 1 четыре ряда подряд. Пока мы не можем предсказать, так как в массиве еще не сохранилось то, что вводил пользователь, мы используем Math.random в качестве предсказания, и записываем ввод пользователя в массив predictArray, добавляя новые значения в history, и сдвигая его. Т. е. если пользователь ввел 0, то:
  255. predictArray[1][1][1][1] = 0; //1,1,1,1 - история, 0 - новое значение
  256. history = [1,1,1,0] //удаляем старую единицу из истории и добавляем введенный только что 0
  257. Для предсказания следующего достаем значение массива predictArray[1,1,1,0], а после ввода опять записываем туда то, что ввёл пользователь (пусть 1):
  258. predictArray[1][1][1][0] = 1; //1,1,1,0 - история, 1 - новое значение
  259. history = [1,1,0,1] //удаляем старую единицу из истории и добавляем введенный только что 1
  260. Таким образом в predictArray накапливаются знания о том, что вводит пользователь после определенной истории чисел. */