Как я могу решить эту вставку массива в объект? - PullRequest
2 голосов
/ 18 июня 2019

Я работаю над текстовым симулятором ровера, и цель состоит в том, чтобы иметь 2 разных ровера, которые получают команды (turnLeft, turnRight, moveForward, moveBackwards) и перемещаются в сетке 10x10.Кроме того, я хочу записать путь каждого ровера, и вот тут у меня возникли некоторые проблемы.Я создал объект travelLog с двумя ключами, rover1 и rover2.Значением каждого ключа является инициализированный массив [].Однако, когда я пытаюсь переместиться вперед, я получаю сообщение об ошибке «TypeError: Невозможно прочитать свойство« push »из undefined».

Каждая команда принимает один аргумент (в данном случае это имя ровера: rover1 или rover2).Поскольку вход в систему происходит в функциях moveForward и moveBackwards, я написал следующее:

const rover1 = {
  direction: 'N',
  x : 0, 
  y : 0,
};

const rover2 = {
  direction: 'N',
  x : 5, 
  y : 7,
};

let travelLog = {
        rover1: [],
        rover2: [],

}


const obstacles = {
  x: [0,1,2,2,4,6,7],
  y: [6,0,2,7,4,3,8],

};


    

// TURNLEFT FUNCTION

function turnLeft(rover){
  console.log("turnLeft was called!");
  switch(rover.direction) {
    case 'N' : 
    rover.direction = 'W'; 
    break; 
    case 'W' : 
    rover.direction = 'S'; 
    break; 
    case 'S' : 
    rover.direction = 'E'; 
    break; 
    case 'E' : 
    rover.direction = 'N'; 
    break; 
  }
};

// TURN RIGHT FUNCTION 

function turnRight(rover){
  console.log("turnRight was called!");

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

// FUNCTION TO CHECK IF THERE IS ANY OBSTACLE AHEAD.

function checkObstacle (rover,otherRover){
  for (let i = 0; i < obstacles.x.length; i++){
    if(obstacles.x[i] === rover.x && obstacles.y[i] === rover.y){
      console.log('An obstacle was found! Order aborted!');
      return true; 
    } else if(otherRover.x=== rover.x && otherRover.y === rover.y){
      console.log('Another rover found in your path! Order aborted!');
      return true; 
    } else {
      return false; 
    }
  }
};

// MOVE FORWARD FUNCTION

function moveForward (rover) {
    console.log("moveForward was called");
    travelLog[rover].push(['[x' + rover.x +',' + 'y' + rover.y + ']' ]);
    
    if(rover.direction === 'N' && rover.y > 0 ){ // NORTHBOUND MOVEMENT
        rover.y--;
        if(checkObstacle()){
          rover.y++;
        };
       

    } else if(rover.direction === 'W' && rover.x > 0){ // WESTBOUND MOVEMENT
      rover.x--;
      if(checkObstacle()){
        rover.x++;
      };
    

    } else if(rover.direction === 'S' && rover.y < 9 ){ // SOUTHBOUND MOVEMENT
      rover.y++;
      if(checkObstacle()){
        rover.y--;
      };
    
  } else if(rover.direction ==='E' && rover.x <9){ //EASTBOUND MOVEMENT
        rover.x++; 
        if(checkObstacle()){
          rover.x--;
        };
              
    } else {
      console.log('Your order tried to put the rover off the grid! Order cancelled!');
    };


    console.log(`The new position of the rover is heading ${rover.direction} row ${rover.x} column ${rover.y}`);
}

Я ожидаю, что новая позиция ровера будет зарегистрирована в объекте travelLog в соответствующем ключе (либо rover1, либо rover2).

1 Ответ

3 голосов
/ 18 июня 2019

Когда вы вызываете travelLog[rover], rover не является строкой, которую можно использовать в качестве ключа для объекта. Вместо этого это сам объект.
Итак, вам нужно иметь имя этого ровера, например rover.name (которое будет rover1), а затем использовать его: travelLog[rover.name]....


Пример

const rover1 = {
  name: 'Bob',
  direction: 'N',
  x: 0,
  y: 0,
};

const rover2 = {
  name: 'Mike',
  direction: 'N',
  x: 5,
  y: 7,
};

let travelLog = {};

// ...

function moveForward(rover) {
  console.log("moveForward was called");
  if (!travelLog[rover.name]) {
    travelLog[rover.name] = [];
  }
  travelLog[rover.name].push(`Rover ${rover.name} moved to [x: ${rover.x},y ${rover.y}]`);

  // ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...