私はいくつかのJavascriptオブジェクトを含む配列を持っています。各オブジェクトは、実際にはキャンバス要素から引かれた水平線分です。各オブジェクトは、プロパティ "lowx"(セグメントの左のx座標)、 "highx"(セグメントの右のx座標)、および "yvalue"(線分が占めるy座標水平)。隣接する行を1つの配列に結合する
隣接するすべての線分を同じ配列に結合するループが必要です。ここで例配列変態だ:
はここ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は(二つの配列が含まれている必要があります隣接する線分の2つのグループ)。 y値が132〜136の線分は第1の配列にあり、y値が138〜140の線分は第2の配列になければなりません。
ので、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は完全に非論理的なものになります。 nullオブジェクトがあります(理由はわかりません)。同じ配列に配置する必要がある線分はありません。
これが対象とするプロジェクトの性質上、これはクライアント側の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をspeficyしてください。必要な出力json – user93
@ user93最後の2つのコードスニペットを見てください。これは、ループの前の変数の内容と、ループの後のコンテンツの外観です。実際にJSONが変更されることはありません。配列が再編成されるだけです。 – DanD