如何使用jQuery从javascript数组中获取最接近的元素?

如何使用jQuery从javascript数组中获取最接近的元素?,javascript,jquery,arrays,Javascript,Jquery,Arrays,我有这样一个javascript数组 var array1= [10,20,30,40,50]; 有没有什么方法可以让我得到最接近给定数字的数组元素?如果我通过26,它应该返回30(26最接近30)。如果我通过42,它将返回40 有什么想法吗?我应该迭代每个元素吗?在jQuery中有什么方法可以实现这一点吗?我使用jQuery创建循环(只是因为我总是加载jQuery)——这并不是必需的。这可能不是最有效的方法。但这里有一个快速函数,可以满足您的需要: var array1 = Array(20

我有这样一个javascript数组

var array1= [10,20,30,40,50];
有没有什么方法可以让我得到最接近给定数字的数组元素?如果我通过26,它应该返回30(26最接近30)。如果我通过42,它将返回40


有什么想法吗?我应该迭代每个元素吗?在jQuery中有什么方法可以实现这一点吗?

我使用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;
}
var array1=数组(20,30,40,50);
var closestindex=findClosest(42,array1);
警报(‘最近的is’+array1[closestindex]);
功能findClosest(针阀、干草堆){
var偏移=10000;
var=0;
$。每个(干草堆,功能(i){

如果(HaveSt[i])p>如果性能是一个关注点(非常大的数组)并且数组是有序的(如在示例中),那么您可能需要考虑A。您可能会找到一个为JavaScript预先编写的,但可能需要稍微修改以处理您的“最接近”。在算法结束时执行一个片段。

简单的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;
}
函数getClosestNum(num,ar) { var i=0,最近,闭合差,电流差; if(ar长度) { 最近值=ar[0];
对于(i;i,因为有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
示例:


使用二进制搜索。如果它是一个非常大的数组,那么您需要实现一个更好的排序功能,例如快速排序,这样性能就不会受到影响。

我不相信jquery中有任何东西可以帮助您解决这一问题。元素可以保证排序吗?我认为jquery没有任何功能可以解决这个问题lem.此外,如果数组是无序的,您需要遍历所有数组并找到答案。只需对其进行排序并循环遍历即可。JQueryy确实没有内置函数。如果(最接近的)
,您将希望更改该函数,因为数组中的0会破坏它。我也有点怀疑您是否有一个名为“最接近的”的局部变量隐藏函数名称。您可能也不需要在每次迭代时重新检查当前的差异:SRight,我在评论中问它是否总是有序的,他还没有回答。我会更新答案以更清楚。我不确定哪一个更快,只是迭代或排序,如果无序,然后进行二进制搜索。我太远了从我的大学算法课上下来。如果这是一个链表的话……那么他就会有O(nlgn):)如果是这样的话,你可以一起去掉数组。@kingjiv:你当然可以。@down投票者:想解释一下吗?或者这是对我上一篇帖子的报复吗?抵消upvote,因为我真的很讨厌人们这样做。虽然我今天在这里的答案上得到了一个upvote,所以可能是有人扫了帖子。@kingjiv:谢谢你的补偿;这一次只是有点奇怪的时机。没什么大不了的,但我确实想请唐纳解释一下。