La matriz que intenté recorrer se llama commands en el objeto de abajo. Le he dado una serie de comandos que he definido en las funciones que se encuentran debajo. Y mi bucle for está en la función inferior llamada commandsArray(). Intento llamar al commandsArray() en el programa para ejecutar el bucle sobre la matriz, pero no funciona.

No estoy seguro de qué estoy haciendo mal. Definitivamente me gustaría usar un bucle for aquí e intentar que eso funcione si es posible. Soy nuevo en Javascript.

     var myRover = {
     position: [[0],[0]],
     direction: 'N',
     roverDirections: ['N', 'E', 'S', 'W'],
     marsGrid: [[0], [0]],
     obstacles: [],
     commands: ['f','f', 'f', 'r', 'f', 'f', 'l', 'f', 'f', 'f', 'b', 'b']
    };

    // MOVE FORWARD & BACKWARD COMMANDS

    function move(command) {


    if (command === 'f') {   //FORWARD

    switch(myRover.direction) {
    case 'N':
      myRover.position[0]++;
      break;
    case 'E':
      myRover.position[1]++;
      break;
    case 'S':
      myRover.position[0]--;
      break;
    case 'W':
      myRover.position[1]--;
      break;
      }
    }

    else if (command === 'b') {  //BACKWARD

        switch(myRover.direction) {
      case 'N':
        myRover.position[0]--;
        break;
      case 'E':
        myRover.position[1]--;
        break;
      case 'S':
        myRover.position[0]++;
        break;
      case 'W':
        myRover.position[1]++;
        break;

        }
       }
       return myRover.position;
      }



    // TURN COMMANDS

    function turn(command){

    if (command === 'l') {   //TURNING LEFT

      switch (myRover.direction) {
        case 'N':
        myRover.direction = 'W';
        break;
        case 'E':
        myRover.direction = 'N';
        break;
        case 'S':
        myRover.direction = 'E';
        break;
        case 'W':
        myRover.direction = 'S';
        break;
      }
    }

    if (command === "r") {    //TURNING RIGHT
      switch (myRover.direction) {
        case 'N':
        myRover.direction = 'E';
        break;
        case 'E':
        myRover.direction = 'S';
        break;
        case 'S':
        myRover.direction = 'W';
        break;
        case 'W':
        myRover.direction = 'N';
        break;
    }
}
     return myRover.direction;



}





    // Executing on a Series of Commands From the Commands Array

    function commandsArray() {


    var commandsLength = myRover.commands.length;
    for (var i = 0; i <= commandsLength; i++) {
        if (commandsLength[i] === 'f') {
          move('f');
        }

        else if (commandsLength[i] === 'b') {
          move('b');
        }

        if (commandsLength[i] === 'r') {
          turn('r');
        }
        else if (commandsLength[i] === 'l') {
          turn('l');
        }

      return myRover.position;
    }
0
universesurfer 15 ene. 2017 a las 13:49
¿Qué significa "no funciona"? ¿Puedes compartir el mensaje de error?
 – 
Davin Tryon
15 ene. 2017 a las 13:51
"no está funcionando" no describe lo que está sucediendo. ¡Se específico!
 – 
nem035
15 ene. 2017 a las 13:52
but it's not working de qué manera. ¿Qué esperas? ¿Qué observas? ¿Hay errores en la consola?
 – 
Jaromanda X
15 ene. 2017 a las 13:52
return myRover.position; parece estar dentro del bucle for.
 – 
Davin Tryon
15 ene. 2017 a las 13:53

1 respuesta

La mejor respuesta

De este bloque de código:

function commandsArray() {

    var commandsLength = myRover.commands.length;
    for (var i = 0; i <= commandsLength; i++) {
        if (commandsLength[i] === 'f') {
          move('f');
        }

        else if (commandsLength[i] === 'b') {
          move('b');
        }

        if (commandsLength[i] === 'r') {
          turn('r');
        }
        else if (commandsLength[i] === 'l') {
          turn('l');
        }

      return myRover.position;
    }
}

Parece que return myRover.position está dentro del bucle for. Y myRover.commands contiene la matriz (no commandsLength). Prueba esto en su lugar:

function commandsArray() {

    var commandsLength = myRover.commands.length;
    for (var i = 0; i <= commandsLength; i++) {
        if (myRover.commands[i] === 'f') {
          move('f');
        }

        else if (myRover.commands[i] === 'b') {
          move('b');
        }

        if (myRover.commands[i] === 'r') {
          turn('r');
        }
        else if (myRover.commands[i] === 'l') {
          turn('l');
        }
    }
    return myRover.position;
}

O mejor aún:

function commandsArray() {
    const turns = ['l', 'r'];
    myRover.commands.forEach(command => {
       if (turns.includes(command)) {
           turn(command);
       } else {
           move(command);
       }
    });
    return myRover.position;
}
0
Davin Tryon 15 ene. 2017 a las 13:57
No recibí ningún mensaje de error, pero al llamar a la función commandsArray (), el móvil no se movería en la cuadrícula.
 – 
universesurfer
15 ene. 2017 a las 14:25
1
¡Funcionó! Lo modifiqué de acuerdo con su segunda sugerencia y la función funcionó. Muchas gracias. Estos momentos son muy alentadores y me mantienen en marcha. Gracias, gracias, gracias.
 – 
universesurfer
15 ene. 2017 a las 14:25
¿Vale la pena incluso crear la variable commandsLength en este caso?
 – 
universesurfer
15 ene. 2017 a las 14:26