我有一个对象,它可以转换为一系列的坐标,用于存储哪些坐标被“占用”。
我以为我有它工作但是在通过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 :(得分: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"]]
也许你打算这样做。
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如何表示它们。