2012-04-05 12 views
0

Ich modifiziere den jquery ui Slider. Ich habe bestimmte "Stopps", zu denen der Benutzer in der Lage sein soll, zu gleiten, ausgedrückt als Prozentsatz der Gesamtbreite des Schiebereglers. Wenn ich zum Beispiel 3 Stopps habe, werden sie gleichmäßig auf 0, 50 und 100 (%) verteilt. Ich speichere diese in einem Array [0,50,100].javascript/jquery - Den nächsten Wert in einem Array finden

Wenn der Benutzer den Schieberegler zieht und loslässt, nehme ich den aktuellen Wert des Schiebereglers auf. Also, wenn er 56% des Weges über die Bar scrollte, ist sein stopVal 56.

Wie schreibe ich eine Funktion, die dann bestimmt, welche Nummer in dem Array dieser StopVal am nächsten ist? Hier ist mein Code:

var optValArr = [0,50,100]; 

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

Antwort

3

Dieses Versuchen:

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

Demo: http://jsfiddle.net/ggzZj/

+0

Das ist großartig, danke für die Hilfe. – mheavers

+0

@mheavers immer froh, ich könnte helfen –

4

Mit dieser Funktion werden Sie lassen Sie sich, dass:

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

Jetzt können Sie dies tun:

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

HINWEIS: Einige Leute betrachten die Definition von Prototypen für native Typen als ebenso gefährlich wie Konflikte, wenn zwei Bibliotheken dasselbe tun (genau wie globale Variable). Wenn Sie eine öffentliche Bibliothek schreiben, sollten Sie daher vermeiden, die Prototypen nativer Typen hinzuzufügen.

+0

Bitte geben Sie Gründe für Downvotes. Ich würde mich freuen, meine Antwort zu verbessern, wenn eine Chance gegeben wird. –

+0

Das Hinzufügen von aufzählbaren Eigenschaften zu einem nativen Prototyp ohne Warnung über die Nebenwirkungen – Raynos

+0

Ok, thx. Ich habe meine Antwort aktualisiert. –

0

Eine andere gebräuchliche Definition von "näher" basiert auf dem Quadrat der Differenz. Aber könnten Sie tun, indem Sie einfach die Nummer hinzufügen, die Sie so in Ihrer ursprünglichen Array wollen:

[10,40,50, my_number] 

Dann sortieren Sie Ihre Array und dann Sie Wahl, wenn Sie die nächste Position von rechts oder links wollen.

Was denkst du?

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

Wird unterstützt

+0

Das ist großartig. Leider hat KmB385 einen Punkt, reduzieren wird nicht wirklich für meine Zwecke aufgrund der Browser-Unterstützung - https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/Reduce. Danke aber - es ist gut zu wissen, dass diese Funktion da draußen ist. – mheavers

Verwandte Themen