2012-04-05 21 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}); 

デモ:

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

は今、あなたはこれを行うことができます:この機能は、あなたが行うことをできるようになるhttp://jsfiddle.net/ggzZj/

+0

おかげさまで助かりました。 – mheavers

+0

@mheaversいつでもうれしい私は助けることができる –

4

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

注記:ネイティブタイプのプロトタイプを、グローバル変数のように2つのライブラリが同じにすると、競合を引き起こす可能性がある危険なものとして定義することを検討する人もいます。パブリックライブラリを作成している場合は、ネイティブタイプのプロトタイプに追加する必要はありません。

+0

downvotesの理由を与えてください。チャンスが与えられれば、私の答えを改善することができれば嬉しいです。 –

+0

ネイティブプロトタイプに列挙可能なプロパティを追加して、副作用についての警告を表示せずに – Raynos

+0

Ok、thx。私は私の答えを更新しました。 –

0

「近い」という別の共通定義は、差の2乗に基づいています。あなたが右または左から最も近い位置にしたい場合は、あなたのアレイと、あなたの選択をソートし、次に

[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

reduceは

+0

これは素晴らしいことです。残念ながら、kmb385にはポイントがあります。ブラウザのサポート - https://developer.mozilla.org/ja/JavaScript/Reference/Global_Objects/Array/Reduceのため、私の目的のためにreduceが実際には機能しません。しかし、ありがとう - それはこの機能がそこにあることを知って良いです。 – mheavers

関連する問題