如何将此 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);
}
}
}
请记住变量 vertices
、entrancePos
、exitPos
和 Path
在你的 C# 代码中对我不可用,所以我只在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);
}
}
}
请记住变量 vertices
、entrancePos
、exitPos
和 Path
在你的 C# 代码中对我不可用,所以我只在JavaScript。尽可能地实施它们。
顺便问一下,这样可以解决问题吗?