2012-04-07 57 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