我有这样如何使用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