2012-04-05 71 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 2012-04-05 12:35:18

+0

@mheavers随时欢迎我可以帮助 – 2012-04-05 12:38:26

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的原因。如果有机会,我很乐意改进我的答案。 – 2012-04-05 00:36:46

+0

您将枚举属性添加到原生原型而没有关于副作用的警告 – Raynos 2012-04-05 13:04:57

+0

好的,thx。我已经更新了我的答案。 – 2012-04-05 15:39:15

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

是否支持 2012-04-05 09:46:40

+0

这太好了。不幸的是,kmb385有一点,由于浏览器的支持,减少对我的目的不会有效 - https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/Reduce。不过谢谢 - 很高兴知道这个功能在那里。 – mheavers 2012-04-05 12:30:10

相关问题