使用jQuery或javascript查找最接近的匹配值
考虑一个标记,如
Some text Some text Some text // <---- target this tag based on value 7 Some text
假设我有一个值,比如说7.是否可以定位其value
属性最接近7的option标签,在这种情况下,它将是 ?
我知道^
这意味着以和$
开头意味着结束,并且希望是否有这样的东西来找到给定值的最接近的匹配。
我会这样的:
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中,您可以根据它们与值的接近程度对所有值进行排序。 例程返回最接近的更大或更低,并且不需要对选项进行排序。