0

我有一个对象,我将其转换为一个坐标数组,该数组将用于存储哪些坐标被“占用”。

我以为我可以正常工作,但是通过 console.log 进一步检查该数组缺少一些结果。

所以这基本上是我的目标:

var sdata = {"4":{"7":["1","7","3","3"]}};

换句话说,这是:

var sdata = {"X":{"Y":["ID","ID","Width","Height"]}

忽略此 ID,因为它们不相关......但我试图使用这些数据,以便我拥有 X 和 Y + 与其瓷砖尺寸宽度和高度相关的额外 X 和 Y 坐标。

想象一下,如果您将 4:7 的对象是 3 x 3 维,那么将存在这 9 个网格引用。

[4:7], [5:7], [6,7]  
[4:8], [5:8], [6,8]  
[4:9], [5:9], [6:9]

所以我创建坐标的功能是:

function populate_collisions() {

  for (var X in sdata) {
    X = parseInt(X);

    for (var Y in sdata[X]) {
      Y = parseInt(Y);
      width = parseInt(sdata[X][Y][2]);
      height = parseInt(sdata[X][Y][3]);

  for (i=X; i!= X+width; i++) {

        if( typeof gcollision[i] == 'undefined' ) {
          gcollision[i] = new Array();
        }
        gcollision[i][Y] = 1

        for (j=Y; j!=Y+height; j++) {

          if( typeof gcollision[X] == 'undefined' ){ 
            gcollision[X] = new Array();
          }
          gcollision[X][j] = 1
        }
      }
    }
  }
}

但是我的逻辑一定是错误的,因为我为我的数组得到了这个结果:

[4] [7] = 1
[4] [8] = 1
[4] [9] = 1
[5] [7] = 1
[6] [7] = 1

知道为什么我会丢失其他数据吗?

4

2 回答 2

1

这是固定代码:

function populate_collisions() {

  for (var X in sdata) {
    X = parseInt(X);

    for (var Y in sdata[X]) {
      Y = parseInt(Y);
      var width = parseInt(sdata[X][Y][2]);
      var height = parseInt(sdata[X][Y][3]);

      for (var i=X; i < X+width; i++) {

        if (!gcollision[i]) {
          gcollision[i] = [];
        }
        gcollision[i][Y] = 1;

        for (var j=Y; j < Y+height; j++) {

在下一部分中,您使用X的是 4,它始终为 4,因此您只是覆盖了该数组。使用i而不是X.

你不需要 if 测试,因为数组是在上面创建的,除非你真的是这样想的gcollision[X][j]或类似的。我不知道,因为我不知道您想要的gcollision对象结构。

/*
          if (!gcollision[i][j]) { 
            gcollision[i][j] = [];
          }
*/          
          gcollision[i][j] = 1;
        }
      }
    }
  }
}

作为记录,生成的对象(假设gcollision没有其他属性)是:

alert(JSON.stringify(gcollision));
/*
{"4":[null,null,null,null,null,null,null,1,1,1],
 "5":[null,null,null,null,null,null,null,1,1,1],
 "6":[null,null,null,null,null,null,null,1,1,1]}
*/

所有这些空值都不存在,数组是稀疏的,但这就是 JSON 表示它们的方式。

于 2012-04-07T03:04:23.653 回答
1

我必须承认我并不完全理解所需的输出,但这似乎是你想要的。

var sdata = {"4":{"7":["1","7","3","3"]}},
    result = [],
    x_arr;
for (var X in sdata) {
    for (var Y in sdata[X]) {
        for (var i = 0; i < sdata[X][Y][2]; i++) {
            x_arr = [];
            result.push(x_arr);
            for (var j = 0; j < sdata[X][Y][3]; j++) {
                x_arr.push((+X + j) + ':' + (+Y + i))
            }
        }
    }
}

我为每个 Array 成员使用了字符串连接。不知道你到底是什么意思[4:7]

结果是……

[["4:7", "5:7", "6:7"], 
 ["4:8", "5:8", "6:8"], 
 ["4:9", "5:9", "6:9"]]

http://jsfiddle.net/mPM96/


也许你是故意的。

var sdata = {"4": {"7": ["1", "7", "3", "3"]}},
    result = [];
for (var X in sdata) {
    for (var Y in sdata[X]) {
        for (var i = 0; i < sdata[X][Y][2]; i++) {
            result[+X + i] = [];
            for (var j = 0; j < sdata[X][Y][3]; j++) {
                result[+X + i][+Y + j] = 1;
            }
        }
    }
}
于 2012-04-07T02:41:40.163 回答