Javascript 如何将数组反移位到对象的每个属性中?

Javascript 如何将数组反移位到对象的每个属性中?,javascript,arrays,Javascript,Arrays,我试图做一个简单的蛇游戏,但是当蛇吃了一块食物时,它并没有给蛇增加一个方块,而是增加了多个方块。我正在编写一些示例代码。原始代码使用unshift()方法将蛇的尾部块放置在蛇的头部 tail = {x: head_x , y: head_y}; snake_array.unshift(tail); 将对象尾部移动到snake_数组中,以将新的x和y坐标添加到snake的前面。我想将两个x值和两个y值反移位到snake_数组中,这样蛇每次吃食物时都会增长两个单位。我想我可以为每个“tail”对

我试图做一个简单的蛇游戏,但是当蛇吃了一块食物时,它并没有给蛇增加一个方块,而是增加了多个方块。我正在编写一些示例代码。原始代码使用unshift()方法将蛇的尾部块放置在蛇的头部

tail = {x: head_x , y: head_y};

snake_array.unshift(tail);
将对象尾部移动到snake_数组中,以将新的x和y坐标添加到snake的前面。我想将两个x值和两个y值反移位到snake_数组中,这样蛇每次吃食物时都会增长两个单位。我想我可以为每个“tail”对象属性使用一个数组,但每次我这样做时,蛇都会消失在遗忘中

if(head_x == food.x && head_y == food.y){
   if (direction == "right") var tail = {x: [head_x+1,head_x] , y: [head_y,head_y]};
snake_array.unshift(tail);
我不明白为什么会发生这种情况,我不能在对象参数内取消移位数组吗

这是我的全部代码,为了便于阅读,我将head_x改为nx,head_y改为ny。我现在只关注蛇何时向左移动,一旦我理解了unshift方法的工作原理,我就可以找出其他方向

if(nx == food.x && ny == food.y){
     var tail;
      if (d == "right") tail = {x: [nx+1,nx] , y: [ny,ny]}; //incremented to get new head position
    else if(d == "left") tail = {x: nx-1,y: ny};
    else if(d == "up") tail = {x: nx,y: ny-1};
    else if(d == "down") tail = {x: nx,y: ny+1};
      //Create new food
      score++;
      create_food();
    }     
    else{
      var tail = snake_array.pop();//pops out last cell
      tail = {x: nx,y: ny};
    }

    snake_array.unshift(tail); //Puts back the tail as the first cell

因此,正如我在注释中所描述的,问题中的代码不起作用,因为数组没有正确地转换为snake_数组。相反,我创建了一个名为“tail”的1x2数组,每个索引包含对象的各个属性及其值。然后我使用了MinusFour推荐的concat()方法。我还将unshift()方法移动到if语句的else部分。我计划清理代码,以便如果我想为每种食物添加5个块或10个块,我可以使用for循环轻松地完成。感谢trincot指出如何使用控制台打印

if (nx == food.x && ny == food.y) {

  if (d == "right") tail = [{x: nx+1,y: ny},{x: nx,y: ny}];
  else if (d == "left") tail = [{x: nx - 1,y: ny},{x: nx,y: ny}];
  else if (d == "up") tail = [{x: nx,y: ny - 1},{x: nx,y: ny}];
  else if (d == "down") tail = [{x: nx,y: ny + 1},{x: nx,y: ny}];
  //Create new food
  create_food();
  snake_array = tail.concat(snake_array);
} else {
  var tail = snake_array.pop(); //pops out last cell
  tail = {x: nx,y: ny};
  console.log(JSON.stringify(tail));
  snake_array.unshift(tail); //Puts back the tail as the first cell
}

为什么不连接数组而不是取消所有的移位呢?您发布的代码似乎还可以。您是否在取消移位后调试并打印数组,比如使用
console.log(JSON.stringify(snake_数组))?这种调试习惯对于确定问题发生的位置至关重要。我想它在代码的其他地方,我不能使用concat()方法,因为我需要为语句的else部分提供一个方向条件。在其他部分中,我弹出蛇的尾部,然后将其移动到蛇的开头。打印控制台是一个很好的技巧,谢谢!我发现当调用unshift方法时,我正在将一个数组插入到对象参数中:
“[{'x':[2,1],'y':[10,10],{'x':0,'y':10},{'x':0,'y':9},
…所以我所做的是将代码从上面改为:
if(d==“right”)tail=[{x:nx+1,y:ny},{x:nx:nx,y:ny}]
这样做的问题是,我开始为x参数获取空值,这很奇怪。