javascript - 如何解决将数组插入对象的问题?

标签 javascript arrays object

我正在开发一个基于文本的漫游器模拟器,目标是让 2 个不同的漫游器获取命令(左转、右转、向前移动、向后移动)并在 10x10 网格中移动。此外,我想记录每个流动站的路径,这就是我遇到的麻烦。我创建了一个带有两个键 rover1 和 rover2 的 TravelLog 对象。每个键的值是一个初始化的数组[]。但是,当我尝试前进时,收到错误“TypeError:无法读取未定义的属性“push””。

每个命令接受一个参数(在本例中为流动站名称: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)。

最佳答案

当您调用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}]`);

  // ...
}

关于javascript - 如何解决将数组插入对象的问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56648190/

相关文章:

javascript - 过滤并包含在数组中,它是如何工作的?

arrays - 在 R data.table 中快速操作字符数组

javascript - 对象数组 - 与其他列数据相比增加一列

javascript - 无法从此代码中看到视频?

javascript - 用 jQuery 替换字符串的限制

javascript - 从数组中删除重复对象,不包括 JavaScript 中的特定键

javascript - 视野中的黄色物体 - 三个 JS

javascript - 使用 jQuery 以编程方式创建 dropzone 实例不起作用?

javascript - jQuery 模态窗口从我的表单中删除元素

javascript - Array.map 函数不适用于对象值