Как сделать цикл над элементами в массиве Javascript с циклом for, выполняя каждый элемент по отдельности перед переходом к следующему (до завершения)?

Массив, который я пытался обойти, вызывается commandsв объекте ниже. Я дал ему ряд команд, которые я определил в функциях ниже него. И мой for loop находится в нижней функции называется commandsArray(). Я пытаюсь вызвать commandsArray()в программе, чтобы выполнить цикл над массивом, но это не работает.

Я не знаю, что я делаю не так. Я определенно хотел бы использовать for-loop здесь и попытаться сделать эту работу, если это возможно. Я новичок в 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;
    }

1 ответ

  1. Из этого блока кода:

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

    Это выглядит как return myRover.positionвнутри forпетли. И myRover.commandsсодержит массив (неcommandsLength). Попробуйте это вместо:

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

    Или еще лучше:

    function commandsArray() {
        const turns = ['l', 'r'];
        myRover.commands.forEach(command => {
           if (turns.includes(command)) {
               turn(command);
           } else {
               move(command);
           }
        });
        return myRover.position;
    }