簡體   English   中英

如何使用 jQuery 從 javascript 數組中獲取最接近的元素?

[英]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

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

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

用二分查找。 但是,如果它是一個非常大的數組,則需要實現更好的排序 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM