No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.

151 líneas
5.8KB

  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. console.debug("создаём уровень", i, п, уровень);
  36. };
  37. }
  38. return уровень;
  39. };
  40. мир.строкаПути = function(п) {
  41. function вСтроку(ключ) {
  42. return `["${ключ}"]`;
  43. }
  44. return "мир" + п.map(вСтроку).join("") + " = ";
  45. };
  46. мир.задатьЗначение = function(путь, значение) {
  47. var уровень = мир;
  48. var длина = путь.length;
  49. for (var i = 0; i < длина; ++i)
  50. {
  51. var п = путь[i];
  52. var конец = (i == длина - 1);
  53. if (уровень[п])
  54. {
  55. if (конец)
  56. {
  57. уровень[п] = значение;
  58. }
  59. else
  60. {
  61. уровень = уровень[п];
  62. }
  63. }
  64. else
  65. {
  66. if (конец)
  67. {
  68. уровень[п] = значение;
  69. }
  70. else
  71. {
  72. уровень[п] = {};
  73. }
  74. };
  75. }
  76. };
  77. мир.разобрать = function(словарь, путь = []) {
  78. for (ключ in словарь)
  79. {
  80. var внутреннийПуть = путь.slice();
  81. внутреннийПуть.push(ключ);
  82. var значение = словарь[ключ];
  83. console.debug("ключ/путь/значение", ключ, внутреннийПуть, значение);
  84. var уровень = мир.путь(внутреннийПуть);
  85. if (typeof значение === "string")
  86. {
  87. // Функция.
  88. if (значение.startsWith("function"))
  89. {
  90. var содержимое = мир.строкаПути(внутреннийПуть) + значение;
  91. console.debug("содержимое", содержимое);
  92. eval(содержимое);
  93. }
  94. // Строка.
  95. else
  96. {
  97. console.debug("строка", значение);
  98. var содержимое = мир.строкаПути(внутреннийПуть) + '"' + значение + '"';
  99. eval(содержимое);
  100. //уровень = значение;
  101. //мир.задатьЗначение(внутреннийПуть, значение);
  102. }
  103. }
  104. // Вложенный объект/слоарь.
  105. else if (значение === Object(значение))
  106. {
  107. мир.разобрать(значение, внутреннийПуть);
  108. }
  109. // Неизвестное.
  110. else
  111. {
  112. console.error("неизвестная пара ключ/значение", ключ, значение);
  113. }
  114. }
  115. };
  116. var json1 = {};
  117. json1.вывести = function(аргумент) {
  118. console.debug('выводим аргумент:', аргумент);
  119. }.toString();
  120. json1.пример = function(аргумент) {
  121. мир.вывести("уга");
  122. console.debug("функция-пример исполнена. аргумент:", аргумент);
  123. }.toString();
  124. json1.набор = {
  125. проба: function() {
  126. console.debug("это проба");
  127. }.toString(),
  128. простоСтрока: "уппамам",
  129. };
  130. json2 = JSON.stringify(json1);
  131. console.debug("2", json2);
  132. var json3 = JSON.parse(json2);
  133. console.debug("3", json3);
  134. мир.разобрать(json3);
  135. console.debug("мир.пример", мир.пример);
  136. мир.пример(123);
  137. мир.вывести(77);
  138. console.debug("мир", мир);
  139. </script>
  140. </body>
  141. </html>