1

我有一个如下所示的数据结构。在Javascript中阻止Array中的循环引用

array=[ 
    {id:"a",children:[ 
     {id:"b",children:[ 
      {id:"d",children:[]}]}, 
      {id:"c",children:[]}]} 
] 

如果我想在“C”插入元素{id:"e", children:["a","f"](“A”,“E”没有字符串,但节点的复印件)我要检查,它存在于上树和因此会创建一个循环参考。所以我认为我必须扭转阵列。但是因为我对Javascript和Node非常陌生,所以我不知道该怎么做。

这是一个好主意,创建一个数组,我将所有的依赖存储在?是这样的:

[ 
a:[], 
b:[a], 
c:[a,b] 
d:[a,b] 
] 

然后我可以查找父数组中,并会看到,在C,A和B是媒体链接的依赖

+0

这是一个有点混乱,但将这样的一个新的对象不会产生循环引用,它只是插入一个新的对象?要创建循环引用,该对象必须实际引用自身。 – adeneo

+0

也许我写错了。我不会用“a”,“e”等字符串添加一个项目,但会添加一个节点的副本。所以它会创建一个 – Florian

+0

如果'children:[e]'实际上指向了父对象,那么您会有循环引用,但这似乎不太可能,并且大部分时间都不成问题。无论如何,你不清楚你想要检查什么?在插入该对象时,是否要检查是否没有更多带有ID“”e“的对象,或者该对象尚未具有循环引用或什么? – adeneo

回答

1

你可以使用一个哈希表,如果ID是唯一。

var array = [{ id: "a", children: [{ id:"b", children: [{ id: "d", children: [] }] }, { id: "c", children: [] }] }], 
 
    hash = Object.create(null); 
 

 
// creating circular reference 
 
array[0].children[1].children.push(array[0]); 
 

 
array.forEach(function iter(a) { 
 
    if (hash[a.id]) { 
 
     console.log(a.id, 'circular reference found'); 
 
     return; 
 
    } 
 
    hash[a.id] = true; 
 
    a.children.forEach(iter); 
 
}); 
 
console.log(array);