2016-12-26 10 views
-2

У меня есть C# сценарий, как показано ниже:Как преобразовать это C# скрипты Javascript

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# one. С теми же данными vertices массив paths вернулся с разным размером. Спасибо, что прочитали, и PLS помочь мне, если вы видите мою ошибку здесь.

+1

«Поведение другое» на самом деле не говорит нам о проблеме. – David

+1

Упомяните точное сообщение об ошибке, которое вы получаете! – Vikrant

+0

После преобразования в код javascript поведение этих функций отличается от C# one. С теми же данными 'vertices' массив' paths' возвращался с разным размером. – ChickenSoups

ответ

0

В # версии C, ваша функция VisitCell имеет условие, которое говорит if(ver2 != parent), но в версии JS вы убедитесь, что они равны вместо не равна.

Кроме того, это условие никогда не пройдет, потому что при первом вызове этой функции вы передаете null для родителя, но в этом условии вы проверяете, что родительский объект «правдивый».

Lodash's isEqual может обрабатывать нулевые значения, поэтому я не уверен, почему вы проверяете, правдивый ли родитель. Возможно, вы хотели это сделать?

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

Да, вы правы, спасибо. Моя глупая ошибка - проверить, что parentVertex. Для _.isEqual это моя ошибка при редактировании кода в вопросе о stackoverflow. – ChickenSoups

0

Существует несколько способов улучшить код 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); 
     } 
    } 
} 

Имейте в виду, что переменные vertices, entrancePos, exitPos и Path не доступны для меня на вашей C# код, так что я только объявить их на JavaScript. Реализуйте их, как можете.

Это исправляет это, между прочим?

+0

Спасибо вам за код. Я думаю, что ваш код очень хорош в структуре. Я проверил это в первый раз, когда я конвертирую скрипт, но весь проект использует эту функцию во многом, я не знаю, но результат по-прежнему не прав, когда используется elseVertices.shift(). Я проголосовал за ваш ответ, но это не может быть общедоступным, потому что моя репутация очень низкая. Еще раз спасибо. – ChickenSoups

+0

Как указано в вашем OP, нам нужно иметь некоторые примеры результатов, чтобы узнать, почему и как отличаются коды. Просто глядя на это, мне кажется, результаты должны быть равны – rabelloo