2013-01-23 15 views
0

我有存儲在變量中的12個不​​同的數字,這樣的:使用Javascript - 檢查一個數是否爲接近2個變量

var span1 = 8.333333333; 
var span2 = 16.66666667; 
var span3 = 25; 
var span4 = 33.33333333; 
var span5 = 41.66666667; 
var span6 = 50; 
var span7 = 58.33333333; 
var span8 = 66.66666667; 
var span9 = 75; 
var span10 = 83.33333333; 
var span11 = 91.66666667; 
var span12 = 100; 

我有一個div的寬度進行比較,以其父寬度,並返回值的函數作爲百分比(減去%符號),例如48.5586。我希望函數檢查結果最接近的這些跨度變量中的哪一個。例如,48.5586將返回"span6",因爲它比41.666667更接近50。

真的不知道從哪一個開始這個,有什麼想法?

+3

是否有你有12個變量而不是一個數組的原因? – 2013-01-23 00:13:47

+0

如果這些是響應式網格的百分比,請不要忘記列之間存在排水溝,而且只有11個排水溝。 –

回答

6

由於每個跨度比前一個跨度多出8 1/3%,這只是100/12,您應該可以使用公式計算出您需要的跨度類。

我制定了以下內容:

function spanClass(percentWidth) { 
    return 'span' + Math.round(percentWidth/(100/12)); 
} 

這給span6爲48.5586。

+1

我相信問題是某種XY問題,並且這是最好的答案:) – Peter

+0

這不起作用,因爲他想要的是最接近的,而不是最接近的一個。但它很接近。 –

+0

@PeterWooster是的,我發現它後不久我意識到。因此我將它改爲'Math.round()'而不是'Math.ceil()'。 – GregL

3

最小的差異可以通過absolute valueminimum之間的輸入數字和每個變量的值之間的差異找到。

也就是說,您應該真正使用適當的數據結構,如對象或數組,將這些字符串映射爲數字。

0

將這些值放入一個數組中,然後您可以根據這些值之間的差異對數組進行排序。最小型差分是第一個數組中,所以這是最接近的值:

var spans = [ 
    { span: 1, value: 8.333333333 }, 
    { span: 2, value: 16.66666667 }, 
    { span: 3, value: 25 }, 
    { span: 4, value: 33.33333333 }, 
    { span: 5, value: 41.66666667 }, 
    { span: 6, value: 50 }, 
    { span: 7, value: 58.33333333 }, 
    { span: 8, value: 66.66666667 }, 
    { span: 9, value: 75 }, 
    { span: 10, value: 83.33333333 }, 
    { span: 11, value: 91.66666667 }, 
    { span: 12, value: 100 } 
]; 

var value = 48.5586; 

spans.sort(function(x, y){ 
    var a = Math.abs(value - x.value); 
    var b = Math.abs(value - y.value); 
    return a == b ? 0 : a < b ? -1 : 1; 
}); 

alert(spans[0].span); 

演示:http://jsfiddle.net/Guffa/77Rf9/

0

其更好地有陣。在我的代碼中,我也將你的變量轉換爲數組然後處理。 EVAL不好,不應該使用

http://codebins.com/bin/4ldqp6b

var span1 = 8.333333333; 
var span2 = 16.66666667; 
var span3 = 25; 
var span4 = 33.33333333; 
var span5 = 41.66666667; 
var span6 = 50; 
var span7 = 58.33333333; 
var span8 = 66.66666667; 
var span9 = 75; 
var span10 = 83.33333333; 
var span11 = 91.66666667; 
var span12 = 100; 

var arr = []; 
for (var i = 0; i < 12; i++) { 
    eval('arr[' + i + '] = span' + (i + 1)); 
} 


function closestTo(arr, val) { 
    var closest = 10000, 
     ind = -1, 
     diff = 10000; // some random number 
    for (var i = 0; i < arr.length; i++) { 
     var tmp = Math.abs(val - arr[i]); 
     if (diff > tmp) { 
      diff = tmp; 
      closest = arr[i]; 
      ind = i; 
     } 
    } 
    alert("Closesnt Number: " + closest + "\nClosest Index:" + ind + "\nclosest variable: span" + (ind + 1)) 
} 

closestTo(arr, 50.12) 
0

在JavaScript中最接近功能的實現。將所有跨度移到一個對象中,以便更容易地迭代它們。只需列舉所有跨度並保持最接近的跨度。

var spans = { 
    span1: 8.333333333, 
    span2: 16.66666667, 
    span3: 25, 
    span4: 33.33333333, 
    span5: 41.66666667, 
    span6: 50, 
    span7: 58.33333333, 
    span8: 66.66666667, 
    span9: 75, 
    span10: 83.33333333, 
    span11: 91.66666667, 
    span12: 100 
}; 

function closest(value) { 
    var delta 
    , lastMatch; 

    Object.keys(spans).forEach(function (span) { 
    var thisDelta; 
    if (!delta) { 
     lastMatch = span; 
     delta = Math.abs(value - spans[span]); 
    } else { 
     thisDelta = Math.abs(value - spans[span]); 
     if (thisDelta < delta) { 
     lastMatch = span; 
     delta = thisDelta; 
     } 
    } 
    }); 
    return lastMatch; 
} 

var result = closest(48.5586); 

console.log(result); 

這裏的一個工作Codepen的例子。

相關問題