2012-04-05 4 views
0

Я изменяю слайдер jquery ui. У меня есть определенные «остановки», которые я хочу, чтобы пользователь мог скользить, выраженный в процентах от общей ширины ползунка. Так, например, если у меня есть 3 остановки, они будут равномерно распределены на 0, 50 и 100 (%). Я храню их в массиве [0,50,100].javascript/jquery - поиск ближайшего значения в массиве

Когда пользователь перетягивает ползунок и релизы, я фиксирую текущее значение ползунка. Так что, если он прокручивает 56% пути через панель, его stopVal составляет 56.

Как написать функцию, которая затем определит, какое число в массиве это stopVal ближе всего? Вот мой код:

var optValArr = [0,50,100]; 

function slideStop(event, ui) { 
    var stopVal = ui.value; 
    //NOW NEED TO FIND CLOSEST ARRAY VALUE TO stopVal 
} 

ответ

3

Попробуйте:

var optValArr = [0,50,100]; 

function slideStop(event, ui) { 
    var stopVal = ui.value; 
    var diff=101; 
    var val =0; 

    for(var i =0; i < optValArr.length; i++){ 
     var tmpDiff = Math.abs(stopVal - optValArr[i]); 
     if(tmpDiff < diff){ 
      diff=tmpDiff; 
      val = optValArr[i] 
     } 
    }    
} 
slideStop("something", {"value":20}); 

Демо: http://jsfiddle.net/ggzZj/

+0

Отлично, спасибо за помощь. – mheavers

+0

@mheavers в любое время рад я мог бы помочь –

4

Эта функция позволит вам, что:

Array.prototype.closest = function(value) { 
    var i; 

    function diff(n) { 
     var diff = n - value; 

     return diff < 0 ? -diff : diff; 
    } 

    var found = this[0], 
     mindiff = diff(found); 

    for (i = 1 ; i < this.length ; i++) { 
     var currentdiff = diff(this[i]); 

     if (currentdiff < mindiff) { 
      found = this[i]; 
      mindiff = diff(found); 
     } 
    } 

    return found; 
} 

Теперь вы можете сделать это:

var optValArr = [0,50,100]; 

function slideStop(event, ui) { 
    var stopVal = ui.value; 
    //NOW NEED TO FIND CLOSEST ARRAY VALUE TO stopVal 


    stopVal = optValArr.closest(stopVal); 
} 

ПРИМЕЧАНИЕ. Некоторые люди считают определение прототипов для родных типов опасными, так как это может вызвать конфликты, если две библиотеки делают то же самое (как глобальная переменная). Если вы пишете публичную библиотеку, вы должны поэтому не добавлять к прототипам родных типов.

+0

Просьба привести причины для downvotes. Я был бы рад улучшить свой ответ, если бы получил шанс. –

+0

Ваше добавление перечислимых свойств в собственный прототип без предупреждения о побочных эффектах – Raynos

+0

Ok, thx. Я обновил свой ответ. –

0

Другое общее определение «ближе» основано на квадрате разницы. Но, вы можете сделать это, просто добавив номер, который вы хотите в вашем исходном массиве, как это:

[10,40,50, my_number] 

Затем сортировать свой массив, а затем вам выбор, если вы хотите, самое близкое положение справа или слева.

Как вы думаете?

1
var optValArr = [0,50,100]; 

function slideStop(event, ui) { 
    var stopVal = ui.value; 
    var closestVal = optValArr.reduce(function (memo, curr) { 
     var currDiff = Math.abs(curr - stopVal), 
      memoDiff = Math.abs(memo - stopVal) 

     return memoDiff < currDiff ? memoDiff : currDif 
    }) 
} 
+0

Поддерживается ли сокращение

+0

Это замечательно. К сожалению, у kmb385 есть точка, сокращение не будет действительно работать для моих целей из-за поддержки браузера - https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/Reduce. Спасибо, хотя - хорошо знать, что эта функция есть. – mheavers

Смежные вопросы