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

How to convert this C# scripts to Javascript

我有一个如下所示的 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);
        }
    }
}

我想将其转换为 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);
        }
    }
}

这里的_符号是lodash符号。

在我转换为 javascript 代码后,这些函数的行为与 C# 函数不同。使用相同的 vertices 数据,返回的 paths 数组大小不同。 感谢您的阅读,如果您在这里看到我的错误,请帮助我。

在 C# 版本中,您的 VisitCell 函数有一个条件 if(ver2 != parent),但在 JS 版本中您检查它们是否 等于 而不是 不等于

此外,该条件永远不会以任何方式通过,因为在您第一次调用该函数时,您为父级传入 null,但在该条件下您检查父级是否为 "truthy"。

Lodash 的 isEqual 可以处理 null 值,所以我不确定你为什么要检查父项是否为真。也许你是故意这样做的?

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

有多种方法可以改进您的 JavaScript 代码。转译代码时,最好不要 copy/paste 和修复,而是使用目标语言重写。

我更愿意这样写,例如:

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);
        }
    }
}

请记住变量 verticesentrancePosexitPosPath 在你的 C# 代码中对我不可用,所以我只在JavaScript。尽可能地实施它们。

顺便问一下,这样可以解决问题吗?