Подтвердить что ты не робот

Определить "циклические структуры данных"

На сайте JSON говорится:

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

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

4b9b3361

Ответ 1

var cyclic = {};
cyclic.somekey = cyclic;
cyclic.another = "Hello world!";

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

alert(cyclic.somekey.somekey.somekey.another);

Ответ 2

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

Например:

var obj = new Object();

obj.left = new Object();

obj.left.left = obj;

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

{ "left": { "left": ??? } }

Ответ 3

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

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

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

 var child = { parent: null };
 var parent = { child: child };
 child.parent = parent;

Ответ 4

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

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

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

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

Ответ 6

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

Ответ 7

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

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" }
  }

Ответ 8

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

ЦИКЛИЧЕСКАЯ СТРУКТУРА ДАННЫХ: Структура данных, в которой может возникнуть такая ситуация. Например, график, связанный список (поочередно/дважды), 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;
}

Ответ 9

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

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

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

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

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

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

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