如何检测 javascript 元素层次结构中的循环

2023-11-30

我有一个元素列表,每个元素都有一个 ID 和一个父 ID。我想要做的是检测这个“层次结构”中何时存在循环,并显示哪个 ID 启动循环。

list = [
  {
    id: '1',
    parent: '2'
  },
  {
    id: '2',
    parent: '3'
  },
  {
    id: '3',
    parent: '4'
  },
    {
    //This id is causing the loop
    id: '4',
    parent: '1'
  }
]

我尝试过这个来构建树,它在没有循环时有效,但在循环时不起作用:

function treeify(list, idAttr, parentAttr, childrenAttr) {
    if (!idAttr) idAttr = 'id';
    if (!parentAttr) parentAttr = 'parent';
    if (!childrenAttr) childrenAttr = 'children';
    var treeList = [];
    var lookup = {};
    list.forEach(function(obj) {
        lookup[obj[idAttr]] = obj;
        obj[childrenAttr] = [];
    });
    list.forEach(function(obj) {
        if (obj[parentAttr] != null) {
            lookup[obj[parentAttr]][childrenAttr].push(obj);
        } else {
            treeList.push(obj);
        }
    });
    return treeList;
};

我也无法检测何时存在循环。

我想返回导致循环的元素的 ID,以便我修复其后面的数据。


您可以应用白灰黑着色来检测在访问其后代时(重新)访问的节点(我已将您的图表简化为父子对列表):

graph = [
    [2, 1],
    [3, 2],
    [1300023, 3],
    [1, 1300023],
];


colors = {}


function visit(vertex) {
    if (colors[vertex] === 'black') {
        // black = ok
        return; 
    }

    if (colors[vertex] === 'grey') {
        // grey = visited while its children are being visited
        // cycle!
        console.log('cycle', colors); 
        return; 
    }

    // mark as being visited
    colors[vertex] = 'grey';

    // visit children
    graph.forEach(edge => {
        if (edge[0] === vertex)
            visit(edge[1]);
    });

    // mark as visited and ok
    colors[vertex] = 'black'

}

visit(1)

这种方法的一个很好的例子:https://algorithms.tutorialhorizo​​n.com/graph-detect-cycle-in-a-directed-graph-using-colors/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何检测 javascript 元素层次结构中的循环 的相关文章

随机推荐

  • 如何立即验证 Silverlight 3 Datagrid 中新插入的行?

    我有一个带有自定义 DataGrid 用户控件的 Silverlight 3 工具库 该网格无法直接访问 WCF RIA 服务实体类型 因此当用户在网格为空时单击网格时 我使用反射来添加新项目 private void InsertEmpt
  • 如何在 Python 3.2 中检查整数?

    我正在尝试编写一个程序 其中用户输入一个两位数整数 输出是打印第一位数字指示的次数的第二位数字 这是我到目前为止所拥有的 number input Type two digit integer n a int number 10 b int
  • 如何在 Elixir 中获取上个月

    如何在不使用 Elixir 中的包或库的情况下获取上个月的数据 例如 如果当前日期是2018 01 25 我会得到2017 12 25 或者如果当前日期是2018 03 31 我会得到2018 02 28 2018年不是闰年 Shehary
  • 如何在 Bootstrap 3 中在移动屏幕上显示桌面版本?

    如何在 Bootstrap 3 上在手机屏幕上显示桌面版本 I don t想要一个切换桌面 移动版本的链接 我只想在移动屏幕上显示桌面版本 需要明确的是 我希望该网站能够在平板电脑上做出响应 但是在 media screen max wid
  • 使用DecimalFormat时如何防止负号?

    我正在使用一个库 它允许我使用 DecimalFormat 模式配置数字格式化方式 我需要删除减号以显示数字的绝对值 我尝试了 0 00 0 00 和 0 00 但没有成功 我可以选择任何减号 例如 0 00 0 00 但我不能根本没有符号
  • c 警告:在常量表达式中使用 const 变量在 C 中是非标准的

    当我尝试将数组初始化为常量大小时 我收到此警告 2170 D 在常量表达式中使用 const 变量在 C 中是非标准的 file h typedef struct LED Blink Pattern LEDSeq void addError
  • 确定哪些(如果有)PCI 设备插入主板 PCI(e) 插槽

    我正在用 C 编写一个程序来在许多 Windows XP 工作站上执行硬件审核 我需要确定哪些 PCI 设备是通过主板插槽连接的实际卡 而不是也使用 PCI 总线 内置于主板中 的板载设备 我可以使用各种 WMI 类成功列出使用所有 PCI
  • 当单元格具有特定值时触发电子邮件

    我是一名篮球教练 我正在创建一个仪表板来监控我的球员的社交媒体 我正在使用 IFTTT com 将所有玩家的推文实时提取到电子表格中 我正在尝试编写一个代码 如果我的一个玩家使用了不恰当的单词 它将触发该单元格向我发送的电子邮件 我觉得我走
  • 在 C# 中引用另一个字符串

    据我所知 C 中的字符串是引用类型 因此 在下面的代码中 a 应该等于 Hi 但它仍然保留其值 Hello 为什么 string a Hello string b a b Hi 许多答案指出字符串是不可变的 虽然这是事实 但这与你的问题完全
  • Java 布局不显示组件(有时)

    我正在为我的学生编写一个 MathQuiz 包括用于渲染的 JLatexMath 和用于蜂鸣器的 jinput 问题是 有时 就像每四次一样 当我启动程序时 没有任何组件可见 它们在调整 JFrame 大小后出现 首先 我想到了 jinpu
  • G Suite 中的 Google Takeout 从 Google 云存储下载

    我是一家非营利组织的 G Suite 管理员 刚刚发现了数据导出功能 这似乎就像个人帐户的外卖 导出文件已准备就绪 现在可以从 Google Cloud Platform Storage 中的存储桶下载 然而 有很多很多文件夹 并且尝试进出
  • 是否可以下载文件的特定部分? [关闭]

    Closed 这个问题需要多问focused 目前不接受答案 所以我想下载一个文件 但我不需要全部 我是否可以跳过文件的前 1 4 并下载其余部分 我已经尝试过 python youtube dl 包 有一些我认为可能有用的相关标志 但我不
  • 如何删除深度未知的深层嵌套字典中的空字段或 None 字段?

    我有一本深度嵌套字典的字典 我试图删除所有 None 或 的 k v 对 下面的字典d是输入的示例 d 1 1 1 a real value 1 2 2 None 3 3 1 3 2 None 通常 要删除字典中的空字段 命令 k v fo
  • 二维数组的运算符[][]重载

    是否可以超载 操作员两次 为了允许 像这样 function 3 3 就像二维数组一样 如果可能的话 我想看一些示例代码 你可以超载operator 返回一个可以使用的对象operator 再次得到结果 class ArrayOfArray
  • 处理java异常的最佳实践

    我开始学习 Java 并用 java 编写我的第一个实用程序类 这些类应该投入生产 当谈到处理异常时 我有点迷失 是否有关于给定代码行中有多少 try 语句的大概数字 有多少代码应该处理异常 Eclipse 的任何插件 最佳实践是在 try
  • 使用 VBA 循环记录集

    我正在尝试按以下方式以循环方式将销售人员 rsSalespeople 分配给客户 rsCustomers 导航到第一个客户 将第一个销售人员分配给该客户 移至下一个客户 如果 rsSalesPersons 不在 EOF 则移至下一个 Sal
  • Java 日期格式“2010-10-11T22:10:10.000Z”

    2010 10 11T22 10 10 000Z 是什么日期格式 那是一个ISO8601日期格式 如果您希望实际解析该格式的日期 您的问题并没有真正明确您的意图 请看看these other问题
  • 需要修改开发者账号中相同设备的UDID

    我已在开发者帐户中添加了大写 UDID 现在它不允许我更改它或通过单击 添加新 添加相同的小写 UDID 我想知道该特定设备是否仍然可以由任何人使用机会 或者我需要其他 UDID 来共享构建 快速答复表示赞赏 提前非常感谢 抱歉 不可能 一
  • 如何从字符串值 Swift 中删除可选

    我想使用不带可选扩展名的字符串值 我使用以下代码从 firebase 解析此数据 Database database reference withPath Locations child Cities observe value with
  • 如何检测 javascript 元素层次结构中的循环

    我有一个元素列表 每个元素都有一个 ID 和一个父 ID 我想要做的是检测这个 层次结构 中何时存在循环 并显示哪个 ID 启动循环 list id 1 parent 2 id 2 parent 3 id 3 parent 4 This i