Определить "циклические структуры данных" - PullRequest
24 голосов
/ 10 июня 2010

На сайте JSON написано

JSON не поддерживает циклические данные структуры, поэтому будьте осторожны, чтобы не дать циклические структуры в JSON stringifier.

Что это значит? Может кто-нибудь привести пример такой структуры данных в Javascript?

Ответы [ 9 ]

30 голосов
/ 10 июня 2010
var cyclic = {};
cyclic.somekey = cyclic;
cyclic.another = "Hello world!";

Теперь вы можете сделать это, например:

alert(cyclic.somekey.somekey.somekey.another);
8 голосов
/ 10 июня 2010

Если вы представляете элементы структуры данных, представленные в виде графика, циклическая структура данных - это то, где элемент ссылается на другой элемент или на саму структуру.

Например:

var obj = new Object();

obj.left = new Object();

obj.left.left = obj;

Это невозможно представить в JSON, вам нужно как-то обратиться к внешней {} части:

{ "left": { "left": ??? } }
2 голосов
/ 10 июня 2010

Циклическая структура данных - это структура, которая содержит ссылку на себя (прямо или косвенно).См. Также http://en.wikipedia.org/wiki/Circular_reference

Вот пример такой структуры:

var c = { value: 'abc' };
c['c'] = c;
c['a'] = { value: c };

Если вы попытаетесь вывести его строковое представление рекурсивно, вы получите переполнение стека, потому что для печатизначение c необходимо вывести значение c.

2 голосов
/ 10 июня 2010

Объект содержит цикл, то есть он относится к самому себе или, в более общем смысле, к какому-либо объекту, на который он ссылается либо напрямую, либо через какое-либо свойство, является исходным объектом.

 var $this =  { };
 $this["self"] = $this;

или более вероятно

 var child = { parent: null };
 var parent = { child: child };
 child.parent = parent;
1 голос
/ 23 июня 2016

CYCLE: Ситуация, в которой вы возвращаетесь в то же место, где вы начали.

СТРУКТУРА ЦИКЛИЧЕСКИХ ДАННЫХ: Структура данных, в которой может возникнуть такая ситуация,Например, график, связанный список (однократно / дважды), удаление очереди и т. Д.

Узел связанного списка в 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;
}
1 голос
/ 10 июня 2010

Полагаю, учебным примером циклической структуры является двусвязный список . Каждый элемент указывает на предыдущий и следующий элементы в списке. Это означает, что каждый элемент образует цикл с предыдущим и следующим элементом.

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" }
  }
1 голос
/ 10 июня 2010
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
1 голос
/ 10 июня 2010

Структура данных с циклическим графиком: http://en.wikipedia.org/wiki/Cycle_graph

0 голосов
/ 10 июня 2010

если у вас есть:

var a = {value: 'a'};
var b = {value: a};
var c = {value: a};

В JSON для b это будет выглядеть так:

"{value: {value: 'a'}}"

В JSON для c это будет выглядеть так:

"{value: {value: 'a'}}"

Нет указателей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...