2011-07-01 43 views
2

我有這樣如何使用jQuery從JavaScript數組中獲取最接近的元素?

var array1= [10,20,30,40,50]; 

JavaScript數組有沒有用,我可以得到最接近的數組元素給定數量的任何方法?例如:如果我通過26,它應該返回30(26最接近30)。如果我通過42,它應該返回40

有什麼想法?我應該迭代通過每個元素?在jQuery中有沒有可用的方法?

+0

我不相信有什麼jQuery中這是會幫助你們。元素是否保證被排序? –

+0

我不認爲JQuery有解決這個問題的任何函數。此外,如果數組無序,則需要遍歷所有數組並找到答案。 – user482594

+0

只是排序,如果數組是有序的壽... – shernshiou

回答

6

簡單用一個for循環。沒有必要jQuery的魔力:

function getClosestNum(num, ar) 
{ 
    var i = 0, closest, closestDiff, currentDiff; 
    if(ar.length) 
    { 
     closest = ar[0]; 
     for(i;i<ar.length;i++) 
     {   
      closestDiff = Math.abs(num - closest); 
      currentDiff = Math.abs(num - ar[i]); 
      if(currentDiff < closestDiff) 
      { 
       closest = ar[i]; 
      } 
      closestDiff = null; 
      currentDiff = null; 
     } 
     //returns first element that is closest to number 
     return closest; 
    } 
    //no length 
    return false; 
} 
+0

你會想改變'if(closest)'因爲數組中的0將它分開。 http://jsfiddle.net/36wUL/ –

+0

我也有點關於你有一個名爲「最接近」的局部變量來映射函數的名字。 – david

+0

你是對的。我在編輯中修復了一些草率的代碼。 – 2011-07-01 19:18:07

-1

我用jQuery來創建循環(只是因爲我總是jQuery的加載) - 這是不是真的有必要。這可能不是最有效的方法。但這裏有一個快速的功能,將你需要的東西:

var array1 = Array(20, 30, 40, 50); 
var closestindex = findClosest(42, array1); 
alert('Closest is '+array1[closestindex]); 

function findClosest(needle, haystack) { 
    var offset = 10000; 
    var closest = 0; 
    $.each(haystack, function(i) { 
     if (haystack[i] <= needle) { 
      var localoffset = needle - haystack[i]; 
     } else { 
      var localoffset = haystack[i] - needle; 
     } 
     if (localoffset <= offset) { 
      offset = localoffset; 
      closest = i; 
     } 
    }); 
    return closest; 
} 
5

如果性能是一個問題(非常大的陣列)和對數組進行排序(如上例),你可能要考慮一個Binary Search。您可能可以找到一個預先編寫的JavaScript,但可能需要稍微修改,以便在算法達到最後時處理您的「最接近」的片斷。

+0

這隻會工作,他並沒有回答然而。我會更新答案,以便更清楚。我不確定哪個更快,只是迭代或排序,然後進行二進制搜索,如果它是無序的。我距離大學算法課程太遠了。 – samccone

+0

對,我在評論中問道,如果它總是下令,並通過它循環..真的沒有內置的功能jQuery的 –

+0

如果只有它是一個鏈表..那麼他會有O(nlgn):) – samccone

1

因爲你的10是連續的範圍,也可以是這樣簡單:

var array1= [10,20,30,40,50]; 
var n = 23; 
var idx = Math.max(Math.round(n/10) - 1, 0); 

例子:

var array1= [10,20,30,40,50]; 
var n = 23; 
var idx = Math.max(Math.round(n/10) - 1, 0); 

alert(array1[ idx ]); // 20 

var n = 28; 
var idx = Math.max(Math.round(n/10) - 1, 0); 

alert(array1[ idx ]); // 30 

var n = 1; 
var idx = Math.max(Math.round(n/10) - 1, 0); 

alert(array1[ idx ]); // 10 

例子:http://jsfiddle.net/GTrNt/

工作應該具有相同其它範圍,例如25:

var array1= [25,50,75,100,125]; 
var n = 23; 
var idx = Math.max(Math.round(n/25) - 1, 0); 

alert(array1[ idx ]); // 25 

var n = 48; 
var idx = Math.max(Math.round(n/25) - 1, 0); 

alert(array1[ idx ]); // 50 

var n = 1; 
var idx = Math.max(Math.round(n/25) - 1, 0); 

alert(array1[ idx ]); // 25 

實例:http://jsfiddle.net/GTrNt/1

+0

如果是這種情況,您可以一起擺脫數組。 –

+0

@kingjiv:你當然可以。 – user113716

+0

@ down-voter:謹慎解釋?還是這是對我上一篇文章的報復? – user113716

0

http://jsfiddle.net/nwUbV/1/

隨着二進制搜索。如果它是一個非常大的數組,那麼您需要實現更好的排序功能,例如Quicksort,這樣性能不會受到影響。

相關問題