2013-01-10 40 views
8

最近的匹配值考虑一个标记,例如查找使用jQuery或JavaScript

<select id="blah"> 
    <option value="3">Some text</option> 
    <option value="4">Some text</option> 
    <option value="8">Some text</option> // <---- target this tag based on value 7 
    <option value="19">Some text</option> 
</select> 

假设我有我的值,说7.是否有可能为目标的选项标签,其value属性是最接近7, ,在这种情况下,将是<option value="8">

我知道^这意味着开始与$这意味着结束与希望如果有这样的事情找到一个给定的值最接近的匹配。

+4

你只寻找最接近的最高值?例如,你有'6','5'有效还是'7'? –

+0

可能是最高或最低...它不会。我只想定位该元素并在其之后添加另一个选项标记 – asprin

+0

选项是否按值排序? –

回答

4

我会是这样的:

http://jsfiddle.net/GNNHy/

var $tmpOption = $('<option value="7">Some text 7</option>'); 
$("#blah").append($tmpOption); 
var my_options = $("#blah option"); 
my_options.sort(function(a,b) { 
    if (parseInt(a.value,10) > parseInt(b.value,10)) return 1; 
    else if (parseInt(a.value,10) < parseInt(b.value,10)) return -1; 
    else return 0 
}) 

$("#blah").empty().append(my_options); 
+3

完美!追加然后排序!逻辑很简单,但我错过了。 +1并被接受 – asprin

1

是的只是用选项值(使用每个函数)减去您的值(7)...具有最小正值结果的值将成为您的目标选项。我希望你会有理想的结果。

+0

我不喜欢不要认为“最接近的更大”是一个正确的解释 –

+0

+1需要时间来发布答案。 – asprin

3

递归如何?它会找到最接近的值:

JS-BIN Demo

function getClosest(val, ddl, increment){ 
    if(ddl.find('option[value="'+val+'"]').length){ 
     return val; 
    } 
    else 
    try{ 
     if(increment) 
    return getClosest(++val, ddl, increment); 
     else 
     return getClosest(--val, ddl, increment); 
    } 
    catch(err){ 
    return -1; 
    } 
} 

function findClosest(val, ddl){ 
    var larger = getClosest(val, ddl, true); 
    var smaller = getClosest(val, ddl, false); 
    if(larger == smaller == -1) 
    return -1; 
    else if (larger == -1) 
    return smaller; 
    else if (smaller == -1) 
    return larger; 

    if(larger - val > val - smaller) 
    return smaller; 
    else 
    return larger 
}  
+0

已更新到最近 –

+0

在这一点上,你的答案比我的更长。怎么来的? :-) –

+0

嗯。我认为我正在以艰难的方式 –

1

最简单的方法也许是美好的旧线性搜索(你可以做二进制的,但它比平常更棘手):

var target; 
var $options; 

var best=Infinity; 
var bestAt; 

$options.each(function(){ 
    var error = this.value - target; 
    error = error>0 ? error : -error; 
    if(error<=best){ 
    best=error; 
    bestAt=this; 
    } 
}) 

//return $(bestAt); 
+0

+1需要时间发布答案。 – asprin

1

如果你可以使用jQuery我会做类似

$(function() { 
     // comes from somewhere 
     var val = 7; 

     var sortByDifference = $("#blah option").sort(function (opt1, opt2) { 
      return Math.abs(parseInt($(opt1).val()) - val) - Math.abs(parseInt($(opt2).val()) - val); 
     }); 

     alert($(sortByDifference[0]).val()); 
    }); 

在sortByDifference中,您将所有值按与您的值的接近程度排序。例程返回最接近的更大或更小值,并且不需要对选项进行排序。

+0

+1需要时间发布答案。 – asprin

1
function findClosest(num){ 
    var select = document.getElementById('blah'); 
    var options = select.options; 
    var dif = Infinity; 
    var index; 
    for(var i = 0; i < options.length; i++){ 
     var newdif = Math.abs(parseInt(options[i].value) - num); 
     if(newdif < dif){ 
      dif = newdif; 
      index = i; 
     } 
    } 
    select.selectedIndex = index; 
} 
+0

什么是'9007199254740992'?它闻起来很糟糕:-) –

+0

请注意,最小数字(x + 1 == x)不是最好的无穷大。 2^53闻起来不好。 –

+0

+1需要时间来发布答案。 – asprin