На сайте JSON говорится:
JSON не поддерживает циклические данные структур, поэтому будьте осторожны, чтобы не давать циклические структуры к JSON stringifier.
Что это значит? Может ли кто-нибудь дать мне пример такой структуры данных в Javascript?
На сайте JSON говорится:
JSON не поддерживает циклические данные структур, поэтому будьте осторожны, чтобы не давать циклические структуры к JSON stringifier.
Что это значит? Может ли кто-нибудь дать мне пример такой структуры данных в Javascript?
var cyclic = {};
cyclic.somekey = cyclic;
cyclic.another = "Hello world!";
Теперь вы можете сделать это, например:
alert(cyclic.somekey.somekey.somekey.another);
Если вы представляете элементы структуры данных, выложенные в виде графика, циклическая структура данных - это то, где элемент ссылается на другой или на структуру.
Например:
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
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" }
}
ЦИКЛ: Ситуация, в которой вы возвращаетесь к тому же месту, где вы начали.
ЦИКЛИЧЕСКАЯ СТРУКТУРА ДАННЫХ: Структура данных, в которой может возникнуть такая ситуация. Например, график, связанный список (поочередно/дважды), dequeue и т.д.
Связанный список node в JS реализуется как:
function Node(data){
this.data = data;
this.next = null;
}
Теперь я создаю два таких узла, как показано ниже:
var node1 = new Node(10);
var node2 = new Node(20);
И свяжите их, чтобы сформировать цикл.
node1.next = node2;
node2.next = node1;
Следующий код обхода вводит бесконечный цикл, который показывает существование цикла.
node = node1;
while(node!==null){
print(node.data);
node = node.next;
}
если у вас есть:
var a = {value: 'a'};
var b = {value: a};
var c = {value: a};
В JSON для b это будет выглядеть так:
"{value: {value: 'a'}}"
В JSON для c это будет выглядеть так:
"{value: {value: 'a'}}"
Нет указателей.