我有以下实体:形式堵塞排细胞场地根元素是Form。里面From是放置的Block。Block包含一些Rows,每个都Row可以包含一些Cell内部具有不同内容的内容:Field或者Block,Block它又是嵌套结构Block -> Rows -> Cells -> Field/Block。它是从根Form到终点的有向有限图Field或Block。只有Block和Field实体具有getId()返回顶点 id 的方法。基于此,我构建了从 root 到具体 vertex 的路径(Blcok, Field)。我试图检查具体的顶点实体(Block)是否按路径呈现在图形中,所以我的解决方案是:从我们开始的地方设置当前顶点(块),设置顶点的收入路径循环获取当前顶点的所有行(块)然后在第一个循环中使用循环从每行中获取所有单元格然后从每个单元格(字段,块)中获取内容检查它是否是 Block 然后获取它id并与传入的路径(id)进行比较如果不相等,则将找到的块设置为当前块(for循环)继续,直到我找不到路径代码是: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++; } }我的错误在哪里?
1 回答
九州编程
TA贡献1785条经验 获得超4个赞
通过一些抽象,您可以得到一个节点是块的图。
其中一些是微不足道的叶子。
您只想对图表进行 dfs,直到找到与您的路径字符串匹配的块
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
}
添加回答
举报
0/150
提交
取消
