我有這樣如何使用jQuery從JavaScript數組中獲取最接近的元素?
var array1= [10,20,30,40,50];
JavaScript數組有沒有用,我可以得到最接近的數組元素給定數量的任何方法?例如:如果我通過26,它應該返回30(26最接近30)。如果我通過42,它應該返回40
有什麼想法?我應該迭代通過每個元素?在jQuery中有沒有可用的方法?
我有這樣如何使用jQuery從JavaScript數組中獲取最接近的元素?
var array1= [10,20,30,40,50];
JavaScript數組有沒有用,我可以得到最接近的數組元素給定數量的任何方法?例如:如果我通過26,它應該返回30(26最接近30)。如果我通過42,它應該返回40
有什麼想法?我應該迭代通過每個元素?在jQuery中有沒有可用的方法?
簡單用一個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;
}
你會想改變'if(closest)'因爲數組中的0將它分開。 http://jsfiddle.net/36wUL/ –
我也有點關於你有一個名爲「最接近」的局部變量來映射函數的名字。 – david
你是對的。我在編輯中修復了一些草率的代碼。 – 2011-07-01 19:18:07
我用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;
}
如果性能是一個問題(非常大的陣列)和對數組進行排序(如上例),你可能要考慮一個Binary Search。您可能可以找到一個預先編寫的JavaScript,但可能需要稍微修改,以便在算法達到最後時處理您的「最接近」的片斷。
因爲你的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
工作應該具有相同其它範圍,例如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
如果是這種情況,您可以一起擺脫數組。 –
@kingjiv:你當然可以。 – user113716
@ down-voter:謹慎解釋?還是這是對我上一篇文章的報復? – user113716
隨着二進制搜索。如果它是一個非常大的數組,那麼您需要實現更好的排序功能,例如Quicksort,這樣性能不會受到影響。
我不相信有什麼jQuery中這是會幫助你們。元素是否保證被排序? –
我不認爲JQuery有解決這個問題的任何函數。此外,如果數組無序,則需要遍歷所有數組並找到答案。 – user482594
只是排序,如果數組是有序的壽... – shernshiou