2012-04-07 86 views
0

我有一个对象,它将im转换为一组将被用来存储哪些坐标被“占用”的坐标。在我的数组中缺少结果

我以为我有它的工作,但通过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 

任何想法,为什么我在想念额外的数据?

+0

你期望得到什么? – 2012-04-07 02:22:41

+2

我不明白你的目标为什么这么复杂。 Surly只需标记属性就更简单了:'sdata = {x:4,y:7,id0:1,id1:7,w:3,h:3};'那么你可以抛弃'parseInt'和for..in东西。直接属性访问应该更快,并且不会被某人向Object.prototype添加可枚举属性(不太可能如此),并且您的对象结构更加灵活。 – RobG 2012-04-07 02:27:20

+0

@RobG它在PHP中生成像这样然后json编码被传递给JS之前:http://www.paste.to/Mzc4MTU1 – Sir 2012-04-07 02:32:32

回答

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如何代表他们。

+0

啊完美:)我无法绕过它!不知道如何从我这个措辞不良的问题中得出结论:P – Sir 2012-04-07 03:09:45

+0

如果存在嵌套递增循环,则内部的循环可能需要使用外部计数器。我不知道你想要实际得到什么,很高兴它的工作。 :-) – RobG 2012-04-07 03:23:41

+0

那么在稍后的阶段,我只需要做到这一点:http://www.paste.to/Mzc4MjE5 – Sir 2012-04-07 03:58:41

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)) 
      } 
     } 
    } 
} 

我为每个数组成员使用了字符串连接。不知道你的意思是[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; 
      } 
     } 
    } 
} 
+0

我期望的结果是在底部显示的内容,只是它不加载9个坐标(因为对象是3by3)。如果我将它们转换为整数或其他内容,您的工作仍会继续吗? = /位混淆你的方法。 – Sir 2012-04-07 02:49:27

+0

@Dave:所以你希望外部数组的索引为'4,5,6',并且每个成员在索引'7,8,9'上都有一个嵌套数组,其值为'1'?我更新了该解决方案。 JavaScript嵌套了数组,而不是真正的多维数组。 – 2012-04-07 03:08:43