function get_map_zoom_level(distance) {
var zoom = 1;
if (distance == 0)
zoom = 11;
else if (distance == 1)
zoom = 15;
else if (distance > 880 && distance <= 1760)
zoom = 14;
else if (distance > 1760 && distance <= 3520)
zoom = 13;
else if (distance > 3520 && distance <= 7040)
zoom = 12;
else if (distance > 7040 && distance <= 14080)
zoom = 11;
else if (distance > 14080 && distance <= 28160)
zoom = 10;
else if (distance > 28160 && distance <= 56320)
zoom = 9;
else if (distance > 56320 && distance <= 112640)
zoom = 8;
else if (distance > 112640 && distance <= 225280)
zoom = 7;
else if (distance > 225280 && distance <= 450560)
zoom = 6;
else if (distance > 450560 && distance <= 889120)
zoom = 5;
else if (distance > 889120 && distance <= 1718240)
zoom = 4;
else if (distance > 1718240)
zoom = 3;
return zoom;
}
我想知道在此代码中是否有任何方法可以避免使用其他许多内容。 基本上我想根据距离找出缩放级别,这段代码工作正常,但我需要一些更好的方法来做到这一点。
答案 0 :(得分:3)
当您有大量if
语句与您的数据进行比较时,通常的方法是创建一个数组,其中每个条目包含要比较的数据和结果,换句话说,最小值距离,最大距离和缩放级别。
要进行比较,可以使用for
循环遍历数组,检查每个数组的值。如果找到匹配的条目,则将结果和break
设置为循环。
这比你的方式更有效或更快,但这意味着你可以拥有任意数量的选项,而你的实际代码也不会变得更大或更复杂。
以下是如何使用您的方法:
function get_map_zoom_level(distance) {
// create the array of values. Each entry can be either an array or an object, doesn't matter too much.
// I'll use an array set up as [minDistance, maxDistance, zoom]
var zoomLevels = [
[880, 1760, 14],
[1760, 3520, 13],
[3520, 7040, 12],
[7040, 14080, 11],
// ... etc.
]
var zoom = 1;
// special cases
if (distance == 0)
zoom = 11;
else if (distance == 1)
zoom = 15;
else if (distance > 1718240)
zoom = 3;
else {
for (var i = 0; i < zoomLevels.length; i++) {
var zoomLevel = zoomLevels[i];
if (distance > zoomLevel[0] && distance <= zoomLevel[1]) {
zoom = zoomLevel[2];
// found a match - stop the loop
break;
}
}
}
return zoom;
}
顺便说一下,缩放级别11似乎有错误,7040和1480不匹配。
答案 1 :(得分:3)
这应该有效:
function get_map_zoom_level(distance) {
var zoom = 15;
var temp=880;
if (distance == 0)
zoom = 11
while (distance > temp){
temp=temp*2;
zoom--;
}
return zoom;
}
答案 2 :(得分:2)
你可以有一个像这样的对象:
var zooms = [ { min:1480 , max:28160} , // array index is zoom level
// ...
{ min:880 , max:1760} ];
然后迭代它直到找到缩放
for(var z = 1 ; z <= MAX_ZOOM ; z++) {
if (distance > zooms[z].min && distance <= zooms[z].max) {
return z;
}
}
答案 3 :(得分:0)
以下代码保持完全相同的边缘情况(显式,例如距离为0 - >缩放为11,隐式,例如距离为42 - >缩放为1),您的代码也具有相同的顺序但是,如果我们不处理边缘情况,则使用按升序排列的距离数组来确定适用的中间范围,表示包含的上限(范围)。独占下限是通过从头开始迭代数组来处理的,因为值是递增的。
function get_map_zoom_level(distance) {
var distanceBreakpoints = [1760, 3520, 7040, 14080, 28160, 56320, 112640, 225280, 450560, 889120, 1718240];
var zoom = 1;
if (distance == 0)
zoom = 11;
else if (distance == 1)
zoom = 15;
else if (distance > 880 && distance <= 1718240) {
for (var i = 0; i < distanceBreakpoints.length; ++i) {
if (distance <= distanceBreakpoints[i]) {
zoom = 14 - i;
break;
}
}
} else if (distance > 1718240)
zoom = 3;
return zoom;
}