2011-07-01 41 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,这样性能不会受到影响。

相关问题