使用jQuery或javascript查找最接近的匹配值

考虑一个标记,如

 Some text Some text Some text // <---- target this tag based on value 7 Some text  

假设我有一个值,比如说7.是否可以定位其value属性最接近7的option标签,在这种情况下,它将是

我知道^这意味着以和$开头意味着结束,并且希望是否有这样的东西来找到给定值的最接近的匹配。

我会这样的:

http://jsfiddle.net/GNNHy/

 var $tmpOption = $(''); $("#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 ); 

递归怎么样? 它会找到最接近的值:

JS-BIN演示

 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 } 

是的,只需用您的值(7)减去选项值(使用每个函数)……具有最小正结果的值将是您的目标选项。 我希望你能得到理想的结果。

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

 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); 
 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; } 

如果你可以使用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中,您可以根据它们与值的接近程度对所有值进行排序。 例程返回最接近的更大或更低,并且不需要对选项进行排序。