2009-09-25 81 views
1

我有JavaScript的一個位,我使用來計算y標尺圖的。我需要根據該值調整比例。這工作,但似乎真的很詳細。有沒有更簡化的方法來做到這一點?流線型Javascript來計算範圍

if (maxValue <= 20000){ 
    chartMaxY = 20000 
}  
if (maxValue <= 10000){ 
    chartMaxY = 10000 
}  
if (maxValue <= 5000){ 
    chartMaxY = 5000 
}  
if (maxValue <= 2500){ 
    chartMaxY = 2500 
} 
if (maxValue <= 1000){ 
    chartMaxY = 1000 
} 
if (maxValue <= 500){ 
    chartMaxY = 500 
}  
if (maxValue <= 250){ 
    chartMaxY = 250 
}   
if (maxValue <= 100){ 
    chartMaxY = 100 
} 
if (maxValue <= 50){ 
    chartMaxY = 50 
} 
if (maxValue <= 10){ 
    chartMaxY = 10 
} 

回答

3

同樣的事情,可能更簡潔取決於你的編程風格。

var keys = [10, 50, 100, 250, 500, 1000, 2500, 5000, 10000, 20000]; 

for (var i=0; i<keys.length; i++) { 
    if (maxValue <= keys[i]) { 
     chartMaxY = keys[i]; 
     break; 
    } 
} 

鍵值相反的順序導致包括maxValue只設置一次,但是請注意,這並不改變值> 20000(雖然也沒有原件)

+0

你絕對是比我的算法更好的算法。 – cwallenpoole 2009-09-25 16:18:00

+0

謝謝,查德威克。我學到了東西! – 2009-09-25 17:18:38

2

爲什麼不使用for循環?

var vals = [ 20000, 10000, 5000, 2500, 1000, 500, 250, 100, 50, 10 ]; 

for(var i = 0; i < vals.length; i++) 
{ 
    if(maxValue > vals[ i ]) 
    { 
     break; 
    } 
    else 
    { 
     chartMaxY = vals[ i ]; 
    } 
} 
+0

謝謝,克里斯!我很感激。 – 2009-09-25 19:02:14

4

這裏有沒有一個循環,將擴展的解決方案至1,2.5,5,10,2.5,...爲任意大的值:

function maxScale(x) { 
    var l = Math.log(x)/Math.LN10, p = Math.floor(l), q = Math.pow(10, l - p); 
    return Math.pow(10, p) * (q > 2.5 ? (q > 5 ? 10 : 5) : 2.5); 
} 
+0

4條線肯定比我的更簡潔。謝謝! – 2009-09-25 17:19:22

+0

+1算法解決方案,而不是硬編碼值。 – Chadwick 2009-09-25 19:11:21