【发布时间】:2017-12-05 13:37:39
【问题描述】:
我有一个包含一些 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应该包含两个数组(因为有两组相邻的线段)。 y 值为 132-136 的线段将在第一个数组中,y 值为 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}]
]
这是我拥有的代码,我认为它已经接近工作状态,但还没有完全实现。通常它 rowarray 最终成为完全不合逻辑的东西。有空对象(不知道为什么?)而应该放在同一个数组中的线段却没有。
由于项目的性质,这需要在客户端 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 请看最后两个代码sn-ps。这是循环之前变量的内容,然后是循环之后的内容。 JSON 并没有真正改变。只是数组被重组
-
然后删除除数组转换和代码 sn-p 之外的问题的其他部分,因为它不相关
-
@RachelGallen 目前,相邻的线段没有合并到同一个数组中。有些段应该在同一个数组中,但不在循环之后。
标签: javascript arrays algorithm html5-canvas