[英]How to get the closest element from a javascript array using jQuery?
我有一個像這樣的 javascript 數組
var array1= [10,20,30,40,50];
有沒有什么方法可以讓我得到最接近給定數字的數組元素? 例如:如果我通過 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;
}
如果性能是一個問題(非常大的數組)並且數組是有序的(如示例中所示),您可能需要考慮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
示例: 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
用二分查找。 但是,如果它是一個非常大的數組,則需要實現更好的排序 function,例如 Quicksort,這樣性能才不會受到影響。
我使用 jQuery 來創建循環(只是因為我總是加載 jQuery) - 這不是真的必要。 這可能不是最有效的方法。 但這里有一個快速 function 可以滿足您的需求:
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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.