2013-01-10 9 views
8

Rozważmy znaczników takich jakZnalezienie najbliższym kolorem wartość za pomocą jQuery lub 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> 

Załóżmy, że mam wartość ze mną, powiedz 7. Czy można kierować tag opcji którego value atrybutem jest najbliżej 7, które w tym przypadku będzie to <option value="8">?

Jestem świadomy ^, co oznacza, że ​​zaczyna się od i $, co oznacza, że ​​kończy się na i miał nadzieję, że istnieje coś takiego, aby znaleźć najbliższe dopasowanie dla danej wartości.

+4

Czy tylko szuka najbliższego najwyższej wartości? Np. Masz '6', czy' 5' jest ważne, czy '7'? –

+0

Może być najwyższy lub najniższy ... to nie ma znaczenia. Chcę tylko kierować ten element i dołączać inny znacznik opcji po lub przed nim. – asprin

+0

Czy opcje sortowane są według wartości? –

Odpowiedz

4

pójdę tak:

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

Idealny! Dołącz, a następnie sortuj! Logika była tak prosta, a jednak tęskniłem za nią. +1 i akceptowane – asprin

1

Tak, po prostu odbierz swoją wartość (7) z wartościami opcji (użyj każdej funkcji) ... wartość z minimalnym pozytywnym wynikiem będzie Twoją docelową opcją. Mam nadzieję, że osiągniesz pożądany rezultat.

+0

Ja don "uważam, że" najbliższy większy "to poprawna interpretacja –

+0

+1 za poświęcenie czasu na opublikowanie odpowiedzi. – asprin

3

Co powiecie na rekursję? znajdzie najbliższą wartość:

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

Zaktualizowano do najbliższej –

+0

W tym momencie twoja odpowiedź jest znacznie dłuższa niż moja. Dlaczego? :-) –

+0

Mmm. Myślę, że robię to na własnej skórze –

1

Najprostszym sposobem jest chyba dobry stary przeszukiwanie liniowe (można zrobić binarne, ale jest to bardziej skomplikowane niż zwykle):

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 za poświęcenie czasu na opublikowanie odpowiedzi. – asprin

1

Jeśli możesz użyć jquery, zrobiłbym coś takiego jak

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

W sortByDifference wszystkie wartości są sortowane według wartości zbliżonej do wartości. Procedura zwraca najbliższy większy lub niższy i nie wymaga sortowania opcji.

+0

+1 za poświęcenie czasu na opublikowanie odpowiedzi. – 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

Co to jest '9007199254740992'? Pachnie okropnie :-) –

+0

Zwróć uwagę, że najmniejsza liczba taka, że ​​(x + 1 == x) nie jest najlepszą nieskończonością. 2^53 pachnie źle. –

+0

+1 za poświęcenie czasu na opublikowanie odpowiedzi. – asprin