JavaScript数学在哪里出错了?

时间:2017-09-26 03:58:14

标签: javascript

我正在尝试将“形状”(四个方格的相对坐标集)转换为像素网格:

var grid_center = 6;
var square_size = 20;

l_shape = {
    coords: [[-1, 0], [0, 0], [1, 0], [-1, 1]]
}

function draw_shape(shape, grid_location) {
    for (coord in shape.coords) {
        trans_coord = (grid_location[0] + coord[0]) * square_size;
        console.log(trans_coord);
    }
}

draw_shape(l_shape, [grid_center - 1, 0]);

预期产出:

100
120
140
160

实际输出:

1000
1020
1040
1060

看起来它可能是自动类型转换的怪异,但我不知道如何。我的所有数字都是实际数字,没有引用字符串。手动输入数学时,我得到了预期的结果:

> (5 + 0) * 20
100

从计算机科学的角度来看,可能有更好的方法可以做到这一点,但我对这些并不感兴趣。我只是想知道为什么上面的程序没有按预期工作。

3 个答案:

答案 0 :(得分:1)

for (coord in shape.coords)会将索引字符串分配给coord

您想要for (coord of shape.coords)

答案 1 :(得分:0)

for (coord in shape.coords)将返回属性索引器。您需要使用shape.coords[coord]来访问实际的数字值。

或者您也可以使用forEach

e.g。

var grid_center = 6;
var square_size = 20;

l_shape = {
  coords: [
    [-1, 0],
    [0, 0],
    [1, 0],
    [-1, 1]
  ]
}

function draw_shape(shape, grid_location) {
  for (coord in shape.coords) {
    trans_coord = (grid_location[0] + shape.coords[coord][0]) * square_size;
    console.log(trans_coord);
  }

  // or
  shape.coords.forEach(function(coord) {
    trans_coord = (grid_location[0] + coord[0]) * square_size;
    console.log(trans_coord);
  });
}

draw_shape(l_shape, [grid_center - 1, 0]);

答案 2 :(得分:-1)

你在这里迭代的方式有点偏。您正在使用专门用于的for ... in方法:

for...in语句迭代对象的可枚举属性...

如果你看coord '0'的价值,那么他们就是'1'for等等。这是因为在JavaScript中,数组是足以使var grid_center = 6; var square_size = 20; var l_shape = { coords: [[-1, 0], [0, 0], [1, 0], [-1, 1]] } function draw_shape(shape, grid_location) { shape.coords.forEach(coord => { trans_coord = (grid_location[0] + coord[0]) * square_size; console.log(trans_coord); }) } draw_shape(l_shape, [grid_center - 1, 0]); 处理它的对象,但这不是你想要的。

你想要的是数组迭代器forEach。如果您使用ES6,代码看起来像这样:

php artisan migrate:fresh

结果不是您所期望的,但您现在正走在正确的轨道上。