我正在开发一个基于文本的漫游器模拟器,目标是让 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/