javascript - 如何找到图中的元素?

标签 javascript algorithm graph-algorithm

我有以下实体:

  1. 表格
  2. 阻止
  3. 单元格
  4. 字段

根元素是Form

From内部放置Block

Block 包含一些 Rows,每个 Row 可以包含一些 Cell,其中包含不同的内容: FieldBlock,其中 Block 又是嵌套结构 Block -> Rows -> Cells -> Field/Block

它是一个有向有限图,从根Form开始,结束顶点FieldBlock

只有BlockField实体具有返回顶点id的方法getId()。基于此,我构建了从根到具体顶点的路径(Blcok,Field)

我尝试检查具体顶点实体( block )是否按路径呈现在图中,所以我的解决方案是:

  1. 从起点设置当前顶点(Block),设置顶点的收入路径
  2. 循环获取当前顶点( block )的所有行
  3. 然后在第一个循环中使用循环获取每行的所有单元格
  4. 然后从每个单元格(字段、 block )获取内容
  5. 检查它是否为 Block,然后获取其 id 并与传入路径(id)进行比较
  6. 如果不相等,则将找到的 block 设置为当前 block (for 循环)
  7. 继续,直到找不到路径

代码是:

function getBlockFieldByPath(block: Block, path: string) {
   let currentBlock = block;
   let irows = 0;
   let jcells = 0;

   while(irows < currentblock.getRows().length) {
       let cells = rows[irows].getCells();
       while(jcells < cells.length) {
           let content = cells[jcells].getContent(); // it is should be Block or Field,

           if (content.getId() == path) {
               return content;
           }

           if (content == Block) {
              currentblock = content; // Because content is Block
           }

          jcells++;
       }
     irows++;
   }   

}

我的错误在哪里?

最佳答案

通过一些抽象,您可以得到一个图,其中节点是 block 。

其中一些是平凡的叶子。

您只想对图表进行 dfs,直到找到与您的路径字符串匹配的 block

function dfs(block, path) {
  if (block.getId() === path) return block
  let found = null
  block.getRows().find(r => r.getCells().find(bContent => {
    let b = bContent.getContent()
    found = dfs(b, path)
    return found
  }))
  return found
}

<小时/>

堆栈的变化

function dfs(block, path) {
  const stack = [block]
  while (stack.length) {
    const b = stack.pop()
    if (b.getId() === path) return block
    b.getRows().forEach(r => r.getCells().forEach(bContent => {
      let b = bContent.getContent()
      stack.push(b)
    })
  }
  return null
}

关于javascript - 如何找到图中的元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60899471/

相关文章:

java - 数组列表的数组列表作为关系的表示

algorithm - 用矩形填充直线多边形(带孔)

c# - 如何创建强大的斐波那契算法?

javascript - Expo 推送通知检测

javascript - 将值从工厂传递到 Controller angularJS

javascript - 异步重新加载 HTML 和 JS 代码使 JS 事件监听器不会对重新加载的 HTML 代码的点击使用react

algorithm - 是否有解决此类投影重建几何问题的算法?

algorithm - 哪种机器学习算法适合投篮?

algorithm - 利润最大化的寻路算法

javascript - 在materialize css中初始化Slider