如何将此C#脚本转换为Javascript

如何将此C#脚本转换为Javascript,javascript,c#,code-conversion,Javascript,C#,Code Conversion,我有一个C#脚本,如下所示: public List<MazePath> BreakIntoConnectedPaths() { List<MazeVertex> remainVertices = new List<MazeVertex>(vertices); List<MazePath> paths = new List<MazePath>(); while (remainVertices.Count >

我有一个C#脚本,如下所示:

public List<MazePath> BreakIntoConnectedPaths()
{
    List<MazeVertex> remainVertices = new List<MazeVertex>(vertices);
    List<MazePath> paths = new List<MazePath>();
    while (remainVertices.Count > 0)
    {
        MazePath path = new MazePath();
        path.entrancePosition = entrancePosition;
        path.exitPosition = exitPosition;
        VisitCell(path, remainVertices.First(), null, remainVertices);
        paths.Add(path);
        //Store the coordinate for entrance and exit 
    }
    return paths;
}

void VisitCell(MazePath path, MazeVertex ver, MazeVertex parent, List<MazeVertex> remainVertices)
{
    remainVertices.Remove(ver);
    path.Add(ver);
    for (int i = 0; i < ver.connectVertices.Count; i++)
    {
        MazeVertex ver2 = ver.connectVertices[i];
        if (ver2 != parent)
        {
            VisitCell(path, ver2, ver, remainVertices);
        }
    }
}
公共列表BreakintoConnectedPath()
{
列表剩余顶点=新列表(顶点);
列表路径=新列表();
而(remainertices.Count>0)
{
MazePath路径=新的MazePath();
path.EnterPosition=入口位置;
path.exitPosition=exitPosition;
VisitCell(路径,remainInvertices.First(),null,remainInvertices);
路径。添加(路径);
//存储入口和出口的坐标
}
返回路径;
}
无效VisitCell(MazePath路径、MazeVertex版本、MazeVertex父级、列表)
{
剩余部分。移除(版本);
路径。添加(版本);
对于(int i=0;i
我想将其转换为javascript,如下所示

BreakIntoConnectedPaths = function() {
    var remainVertices = _.cloneDeep(this.vertices);
    var paths = [];

    while (remainVertices.length > 0) {
        var path = new Path();
        path.entrancePos = this.entrancePos;
        path.exitPos = this.exitPos;
        this.VisitCell(path, remainVertices[0], null, remainVertices);
        paths.push(path);
        // Store the coordinate for entrance and exit
    }
    return paths;
}

VisitCell = function(path, vertex, parentVertex, remainVertices) {
    _.remove(remainVertices, function(v) {
        return v.x === vertex.x && v.z === vertex.z;
    });
    path.Add(vertex);
    for (var i = 0; i < vertex.connectVertices.length; i++) {
        var connectedVertex = vertex.connectVertices[i];
        // if (parentVertex && (connectedVertex.x !== parentVertex.x || connectedVertex.z !== parentVertex.z)) {
        if(parentVertex && _.isEqual(connectedVertex, parentVertex)) {
            VisitCell(path, connectedVertex, vertex, remainVertices);
        }
    }
}
BreakintoConnectedPath=函数(){
var remaininvertices=u.cloneDeep(this.vertices);
var路径=[];
while(remainertices.length>0){
var path=新路径();
path.enterpos=this.enterpos;
path.exitPos=this.exitPos;
this.VisitCell(路径,remaininvertices[0],null,remaininvertices);
路径。推送(路径);
//存储入口和出口的坐标
}
返回路径;
}
VisitCell=函数(路径、顶点、父顶点、剩余反转){
_.移除(剩余),功能(v){
返回v.x==vertex.x&&v.z==vertex.z;
});
添加(顶点);
对于(var i=0;i
这里的
\u
符号是符号


转换为javascript代码后,这些函数的行为与C#one不同。对于相同的
顶点
数据,
路径
数组返回的大小不同。 感谢您的阅读,如果您看到我的错误,请帮助我。

在C版本中,VisitCell函数的条件是
如果(ver2!=parent)
,但在JS版本中,您检查它们是否相等

而且,该条件永远不会通过任何方式,因为在您对该函数的第一次调用中,您为父函数传入了
null
,但在该条件下,您检查父函数是否为“truthy”

Lodash的
isEqual
可以处理空值,因此我不确定您为什么要检查父级是否真实存在。也许您是有意这样做的

 if(!_.isEqual(connectedVertex, parentVertex)) {

有几种方法可以改进JavaScript代码。在传输代码时,最好不要复制/粘贴和修复代码,而是使用目标语言重写代码

我更愿意将其写出来,例如:

var vertices;
var entrancePos;
var exitPos;

function Path(entrancePos, exitPos){
    this.entrancePos = entrancePos;
    this.exitPos = exitPos;

    this.Add = function() {
        // your Add() code here
    }
}

function breakIntoConnectedPaths() {
    var remainingVertices = _.cloneDeep(vertices);
    var paths = [];

    while (remainVertices.length) {
        var path = new Path(entrancePos, exitPos);
        visitCell(path, remainingVertices.shift());

        // Store the coordinate for entrance and exit
        paths.push(path);
    }

    return paths;
}

function visitCell(path, vertex, parentVertex) {
    path.Add(vertex);

    for (var i = 0; i < vertex.connectVertices.length; i++) {
        var connectedVertex = vertex.connectVertices[i];
        if(_.isEqual(connectedVertex, parentVertex)) {
            visitCell(path, connectedVertex, vertex);
        }
    }
}
var顶点;
var-pos;
var-exitPos;
功能路径(入口POS、出口POS){
this.enterpos=enterpos;
this.exitPos=exitPos;
this.Add=函数(){
//在这里输入Add()代码
}
}
函数breakIntoConnectedPaths(){
var remainingVertices=u.cloneDeep(顶点);
var路径=[];
while(剩余长度){
var路径=新路径(入口POS、出口POS);
visitCell(路径,remainingVertexts.shift());
//存储入口和出口的坐标
路径。推送(路径);
}
返回路径;
}
函数visitCell(路径、顶点、父顶点){
添加(顶点);
对于(var i=0;i
请记住,变量
顶点
入口pos
出口pos
路径
在您的C#代码中不可用,因此我仅在JavaScript中声明它们。请尽可能实现它们


顺便问一下,这能解决问题吗?

“行为不同”没有告诉我们太多关于这个问题的信息。提到确切的错误消息,你得到了!在我转换成javascript代码后,这些函数的行为与C#one不同。对于相同的
顶点
数据,
路径
数组返回了不同的大小。一个出错的示例是有帮助的,你是对的,谢谢。我愚蠢的错误是检查parentVertex。对于uq.isEqual,这是我在编辑stackoverflow问题中的代码时犯的错误。谢谢你的代码。我认为你的代码在结构上非常好。我在第一次转换脚本时已经测试过这一点,但整个项目在许多方面都使用了这个函数,我不知道“我不知道,但使用remainingVertices.shift()时结果仍然错误。我对你的答案投了赞成票,但因为我的声誉很低,所以无法公开查看。再次感谢你。正如在你的OP中所问的,我们需要一些结果示例来了解代码之间的差异原因或原因。在我看来,结果应该是相同的。”