【问题标题】:How can I solve this pushing of an array into an object?如何解决将数组推入对象的问题?
【发布时间】:2019-06-18 11:33:08
【问题描述】:

我正在开发基于文本的漫游车模拟器,目标是让 2 个不同的漫游车获得命令(turnLeft、turnRight、moveForward、moveBackwards)并在 10x10 网格中移动。此外,我想记录每个漫游者的路径,这就是我遇到麻烦的地方。我用两个键 rover1 和 rover2 创建了一个对象 travelLog。每个键的值是一个初始化数组[]。但是,当我尝试向前移动时,我收到错误“TypeError: Cannot read property 'push' of 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)中。

【问题讨论】:

  • 你没有告诉我们什么调用moveForward(),因为传递的参数将决定是否可以找到对象的属性
  • 如果我理解你的话,传递的参数将是 rover1 或 rover2。
  • 不一定...如果您传递moveForward(rover1),那么您传递的是对象rover而不是字符串。您无法使用对象获取对象的属性。如果您通过moveForward("rover1"),那么它可能会工作......或查看seelts答案,通过向对象添加name属性来获得更好的解决方案
  • 你的代码有一个奇怪的地方是 moveForward 函数。为什么不使用开关盒?您还检查障碍物,如果是,则执行相反的操作。没有障碍就不能行动吗?
  • 我正在通过 moverForward(rover1)。对不起,如果我不能很好地解释自己,谢谢你的帮助。

标签: javascript arrays object


【解决方案1】:

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

  // ...
}

【讨论】:

  • 我明白了,但是如果我设置了rover.name,那么这个函数就不能和rover2重用了,对吧?我希望通过将 rover.name 作为函数的参数传递,我也可以将其自动包含在 push 方法中。这可能吗?
  • 为什么不呢?您可以在任何流动站上调用相同的函数。您唯一需要做的就是在所有漫游者对象中添加一个name 字段。
  • 我在答案中添加了一个示例
  • 顺便说一句,你是pushing 一个数组到数组。我不认为你真的需要它。你可以推送一个字符串push(`[x: ${rover.x},y ${rover.y}]`)
  • 好的,我会听从你的建议。我会让你知道情况如何。 @seelts,非常感谢!
猜你喜欢
  • 1970-01-01
  • 2016-12-25
  • 2019-03-24
  • 2017-05-01
  • 1970-01-01
  • 2016-05-09
  • 2017-12-05
  • 2020-02-08
相关资源
最近更新 更多