我的数组中缺少结果

时间:2012-04-07 02:14:56

标签: javascript

我有一个对象,它可以转换为一系列的坐标,用于存储哪些坐标被“占用”。

我以为我有它工作但是在通过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×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

知道为什么我缺少额外的数据吗?

2 个答案:

答案 0 :(得分: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;
            }
        }
    }
}

答案 1 :(得分: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,因此您只是覆盖了该数组。使用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如何表示它们。