На сайте JSON это говорит
JSON не поддерживает циклические структуры данных, так старается не дать циклические структуры JSON stringifier.
Что означает этим? Кто-то может дать мне пример такой структуры данных в JavaScript?
var cyclic = {};
cyclic.somekey = cyclic;
cyclic.another = "Hello world!";
Теперь вы можете сделать это, например:
alert(cyclic.somekey.somekey.somekey.another);
js> var a = {label:"a", next:null};
js> var b = {label:"b", next:a};
js> a.next = b; // cycle is created here
[object Object]
js> print(a.next.label);
b
js> print(a.next.next.label);
a
js> print(a.next.next.next.label);
b
js> print(a.next.next.next.next.label);
a
Думаю, учебным примером циклической структуры является двусвязный список . Каждый элемент указывает на предыдущий и следующий элементы в списке. Это означает, что каждый элемент образует цикл с предыдущим и следующим элементом.
A --> B --> C
A <-- B <-- C
(Здесь каждый A, B, C, хотя и написанный дважды, представляет собой один объект.)
A указывает на B, как следующий в списке. B указывает на A, как и предыдущее в списке. Таким образом, существует цикл от A до B и обратно к A. То же самое верно для каждого элемента в списке, с элементами, не входящими в начало или конец, принадлежащими двум циклам.
Одним из решений сериализации списков, подобных этому, является использование идентификаторов для представления каждого объекта. Это удаляет циклы в структуре. Затем мы могли бы написать
list: {
items:
{ id:"a", value1: ... etc },
{ id:"b", values .... },
{ id:"c", values .... }
links:
{ elem:"a", next:"b" },
{ elem:"b", next:"c", prev: "a"},
{ elem:"c", prev:"b" }
}
, если у вас есть:
var a = {value: 'a'};
var b = {value: a};
var c = {value: a};
В JSON для b это будет выглядеть так:
"{value: {value: 'a'}}"
В JSON для c это будет выглядеть так:
"{value: {value: 'a'}}"
Нет указателей.
Если вы представите элементы структуры данных, представленные в виде графа, циклическая структура данных - это то место, где член ссылается на другой элемент или на саму структуру.
Например:
var obj = new Object();
obj.left = new Object();
obj.left.left = obj;
Это невозможно представить в JSON, вам нужно как-то сослаться на внешнюю часть {}
:
{ "left": { "left": ??? } }
Объект содержит цикл, т.е. он ссылается сам на себя или, в более общем случае, какой-то объект, на который он ссылается либо напрямую, либо через какое-то свойство, является исходным объектом.
var $this = { };
$this["self"] = $this;
или более вероятно
var child = { parent: null };
var parent = { child: child };
child.parent = parent;
Циклическая структура данных - это структура, которая содержит ссылку на саму себя (прямо или косвенно). См. также http://en.wikipedia.org/wiki/Circular_reference
Вот пример такой структуры:
var c = { value: 'abc' };
c['c'] = c;
c['a'] = { value: c };
Если попытаться рекурсивно вывести ее строковое представление, то произойдет переполнение стека, поскольку для вывода значения c
необходимо вывести значение c
.
Структура данных с циклическим графом: http://en.wikipedia.org/wiki/Cycle_graph