Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

149 řádky
5.5KB

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
  5. <title>json</title>
  6. <style>
  7. html, body {
  8. margin: 0;
  9. padding: 0;
  10. overflow: hidden;
  11. }
  12. body {
  13. height: 100vh;
  14. width: 100vw;
  15. }
  16. </style>
  17. </head>
  18. <body>
  19. <script>
  20. var мир = {};
  21. мир.путь = function(пп) {
  22. var уровень = мир;
  23. var длина = пп.length;
  24. for (var i = 0; i < длина; ++i)
  25. {
  26. var п = пп[i];
  27. if (уровень[п])
  28. {
  29. уровень = уровень[п];
  30. }
  31. else
  32. {
  33. уровень[п] = {};
  34. уровень = уровень[п];
  35. };
  36. }
  37. return уровень;
  38. };
  39. мир.строкаПути = function(п) {
  40. function вСтроку(ключ) {
  41. return `["${ключ}"]`;
  42. }
  43. return "мир" + п.map(вСтроку).join("") + " = ";
  44. };
  45. мир.задатьЗначение = function(путь, значение) {
  46. var уровень = мир;
  47. var длина = путь.length;
  48. for (var i = 0; i < длина; ++i)
  49. {
  50. var п = путь[i];
  51. var конец = (i == длина - 1);
  52. if (уровень[п])
  53. {
  54. if (конец)
  55. {
  56. уровень[п] = значение;
  57. }
  58. else
  59. {
  60. уровень = уровень[п];
  61. }
  62. }
  63. else
  64. {
  65. if (конец)
  66. {
  67. уровень[п] = значение;
  68. }
  69. else
  70. {
  71. уровень[п] = {};
  72. }
  73. };
  74. }
  75. };
  76. мир.разобрать = function(словарь, путь = []) {
  77. for (ключ in словарь)
  78. {
  79. var внутреннийПуть = путь.slice();
  80. внутреннийПуть.push(ключ);
  81. var значение = словарь[ключ];
  82. console.debug("ключ/путь/значение", ключ, внутреннийПуть, значение);
  83. var уровень = мир.путь(внутреннийПуть);
  84. if (typeof значение === "string")
  85. {
  86. // Функция.
  87. if (значение.startsWith("function"))
  88. {
  89. var содержимое = мир.строкаПути(внутреннийПуть) + значение;
  90. console.debug("содержимое", содержимое);
  91. eval(содержимое);
  92. }
  93. // Строка.
  94. else
  95. {
  96. console.debug("строка", значение);
  97. уровень = значение;
  98. //мир.задатьЗначение(внутреннийПуть, значение);
  99. }
  100. }
  101. // Вложенный объект/слоарь.
  102. else if (значение === Object(значение))
  103. {
  104. мир.разобрать(значение, внутреннийПуть);
  105. }
  106. // Неизвестное.
  107. else
  108. {
  109. console.error("неизвестная пара ключ/значение", ключ, значение);
  110. }
  111. }
  112. };
  113. var json1 = {};
  114. json1.вывести = function(аргумент) {
  115. console.debug('выводим аргумент:', аргумент);
  116. }.toString();
  117. json1.пример = function(аргумент) {
  118. мир.вывести("уга");
  119. console.debug("функция-пример исполнена. аргумент:", аргумент);
  120. }.toString();
  121. json1.набор = {
  122. проба: function() {
  123. console.debug("это проба");
  124. }.toString(),
  125. простоСтрока: "уппамам",
  126. };
  127. json2 = JSON.stringify(json1);
  128. console.debug("2", json2);
  129. var json3 = JSON.parse(json2);
  130. console.debug("3", json3);
  131. мир.разобрать(json3);
  132. console.debug("мир.пример", мир.пример);
  133. мир.пример(123);
  134. мир.вывести(77);
  135. console.debug("мир", мир);
  136. </script>
  137. </body>
  138. </html>