【问题标题】:prevent circular reference in Array in Javascript防止Javascript中数组中的循环引用
【发布时间】:2017-06-15 14:50:23
【问题描述】:

我有一个如下的数据结构。

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 都已经存在依赖关系

【问题讨论】:

  • 这有点令人困惑,但是像这样插入一个新对象不会创建循环引用,它只是插入一个新对象?要进行循环引用,对象必须实际引用自身。
  • 也许我写错了。我不会添加带有“a”、“e”之类的字符串但带有节点副本的项目。所以它会创建一个
  • 如果children : [e] 实际上引用了父对象,那么您将有循环引用,但这似乎不太可能,而且大多数时候不会成为问题。无论如何,尚不清楚您要检查什么?插入该对象时,您是否要检查是否没有更多 ID 为 "e" 的对象,或者该对象还没有循环引用,或者什么?
  • 我想检查是否有对“a”的引用
  • 您必须避免的第一件事是不要将引用自身的对象放入children 属性中。另一方面,我无法想象在什么要求下您最终需要检查循环引用。您是否要嵌套一个平面数据结构..?可能有一些方法可以避免检查您想要实现的任何目标。

标签: javascript arrays node.js data-structures circular-reference


【解决方案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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-24
    相关资源
    最近更新 更多