我有一個包含一些Javascript對象的數組。每個對象實際上是一個從畫布元素中拉出的水平線段。每個對象都具有屬性「lowx」(段的左側x座標),「highx」(段的右側x座標)和「yvalue」(線段佔據的y座標,因爲它是水平)。將相鄰行組合到一個數組中
我需要一個循環,將所有相鄰的線段組合到同一個數組中。下面是一個例如陣列轉換:
下面是rowarray會是什麼樣通過這個循環中運行之前,像一個例子:
var rowarray = [
[{"lowx": 210, "highx": 212, "yvalue": 132}],
[{"lowx": 208, "highx": 214, "yvalue": 133}],
[{"lowx": 207, "highx": 215, "yvalue": 134}],
[{"lowx": 207, "highx": 216, "yvalue": 135}],
[{"lowx": 206, "highx": 216, "yvalue": 136}],
[{"lowx": 206, "highx": 216, "yvalue": 138}],
[{"lowx": 205, "highx": 220, "yvalue": 139}],
[{"lowx": 199, "highx": 209, "yvalue": 140}]
]
通過循環運行後,rowarray應該包含兩個數組(因爲有兩組相鄰的線段)。 yvalues爲132-136的線段將位於第一個數組中,而yvalues爲138-140的線段應位於第二個數組中。
所以,rowarray會再看看這樣的:
var rowarray = [
[{"lowx": 210, "highx": 212, "yvalue": 132},
{"lowx": 208, "highx": 214, "yvalue": 133},
{"lowx": 207, "highx": 215, "yvalue": 134},
{"lowx": 207, "highx": 216, "yvalue": 135},
{"lowx": 206, "highx": 216, "yvalue": 136}],
[{"lowx": 206, "highx": 216, "yvalue": 138},
{"lowx": 205, "highx": 220, "yvalue": 139},
{"lowx": 199, "highx": 209, "yvalue": 140}]
]
下面是我的代碼,我認爲這是接近的工作,但還沒有應用。通常情況下,排列陣列最終會變得完全不合邏輯。有空對象(不知道爲什麼?)和應該放在同一個數組中的線段不是。
由於該項目的性質,這需要在客戶端JavaScript中完成。但是,使用JQuery很好,並且很受歡迎。
var keepgoing = 1;
var errorcounter = 0;
while (keepgoing == 1) {
try {
hadtocombine = 0;
for (var x = rowarray.length-1; x >= 0; x--) {
for (var w = rowarray.length-1; w >= 0; w--) {
for (var q = rowarray[x].length-1; q >= 0; q--) {
for (var z = rowarray[w].length-1; z >= 0; z--) {
if ((rowarray[x][q].yvalue == (rowarray[w][z].yvalue + 1)) || (rowarray[x][q].yvalue == (rowarray[w][z].yvalue - 1))) {
if ((rowarray[x][q].highx >= rowarray[w][z].lowx) && (rowarray[x][q].highx <= rowarray[w][z].highx)) {
rowarray.splice(w,1);
rowarray.splice(x,1);
rowarray.push(rowarray[x].concat(rowarray[w]));
hadtocombine = 1;
}
else if ((rowarray[x][q].lowx >= rowarray[w][z].lowx) && (rowarray[x][q].lowx <= rowarray[w][z].highx)) {
rowarray.splice(w,1);
rowarray.splice(x,1);
rowarray.push(rowarray[x].concat(rowarray[w]));
hadtocombine = 1;
}
else if ((rowarray[x][q].highx >= rowarray[w][z].highx) && (rowarray[x][q].lowx <= rowarray[w][z].lowx)) {
rowarray.splice(w,1);
rowarray.splice(x,1);
rowarray.push(rowarray[x].concat(rowarray[w]));
hadtocombine = 1;
}
else if ((rowarray[x][q].lowx >= rowarray[w][z].lowx) && (rowarray[x][q].highx <= rowarray[x][q].highx)) {
rowarray.splice(w,1);
rowarray.splice(x,1);
rowarray.push(rowarray[x].concat(rowarray[w]));
hadtocombine = 1;
}
}
}
}
}
}
if (hadtocombine == 0) {
keepgoing = 0;
}
} catch (err) { errorcounter++; if(errorcounter >= 20000) { keepgoing = 10; } }
}
希望我能夠很好地解釋這一點 - 如果沒有評論,我會修改。這是我的第一篇文章(潛伏多年後),所以我希望我已經做好了。
謝謝!
這根本不清楚;目前發生了什麼?有什麼問題? –
請輸入json並輸出json所需的文件 – user93
@ user93請看最後兩個代碼片段。這是循環之前變量的內容,然後循環後內容應該是什麼樣子。沒有JSON真的發生了變化;它只是數組得到重組 – DanD