如何将此C#脚本转换为Javascript
我有一个C#脚本,如下所示:如何将此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 >
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中所问的,我们需要一些结果示例来了解代码之间的差异原因或原因。在我看来,结果应该是相同的。”