定义“循环数据结构”

时间:2010-06-09 22:09:27

标签: javascript json data-structures

JSON site上说

  

JSON不支持循环数据   结构,所以要小心不要给   JSON的循环结构   stringifier。

这是什么意思?有人可以在Javascript中给我一个这样的数据结构的例子吗?

9 个答案:

答案 0 :(得分:30)

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

现在你可以这样做,例如:

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

答案 1 :(得分:8)

如果您将数据结构的成员想象成图形,则循环数据结构是成员引用另一个成员或结构本身的位置。

例如:

var obj = new Object();

obj.left = new Object();

obj.left.left = obj;

这在JSON中无法表示,您需要以某种方式引用外部{}部分:

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

答案 2 :(得分:2)

该对象包含一个循环,即它引用自身,或者更一般地说,它直接或通过某些属性引用的某个对象是原始对象。

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

或更可能

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

答案 3 :(得分:2)

循环数据结构是保持对其自身(直接或间接)的引用的结构。 另请参阅http://en.wikipedia.org/wiki/Circular_reference

以下是此类结构的示例:

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

如果您尝试递归打印其字符串表示形式,最终会出现堆栈溢出,因为要打印值c,您必须打印c的值。

答案 4 :(得分:1)

带有循环图的数据结构:http://en.wikipedia.org/wiki/Cycle_graph

答案 5 :(得分:1)

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

答案 6 :(得分:1)

我想循环结构的教科书示例是doubly-linked list。每个元素都指向列表中的上一个和下一个元素。这意味着每个元素与前一个和下一个元素形成一个循环。

A --> B  --> C
A <-- B  <-- C

(这里每个A,B,C虽然写了两次是一个对象。)

指向B的点,如列表中的下一个。 B指向列表中的上一个A.所以从A到B有一个循环,然后回到A.对于列表中的每个元素都是如此,元素不在头部或尾部,而是两个周期。

序列化这样的列表的一个解决方案是使用ID来表示每个对象。这将删除结构中的循环。然后我们可以写出

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

答案 7 :(得分:1)

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

答案 8 :(得分:-2)

如果你有:

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

在JSON for b中它看起来像:

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

在JSON for c中它看起来像:

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

没有指针。