我有像这样的javascript数组
var array1= [10,20,30,40,50];
是否有任何方法可以将最接近的数组元素用于给定数字?例如:如果我通过26,它应该返回30(26最接近30)。如果我通过42,它应该返回40。
有什么想法?我应该通过每个元素进行迭代吗?在jQuery中有没有可用的方法?
答案 0 :(得分: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;
}
答案 1 :(得分:5)
如果性能是一个问题(非常大的数组)并且数组是有序的(如示例中所示),您可能需要考虑Binary Search。您可以找到一个为javascript预先编写的内容,但是一旦算法结束,可能需要稍微修改以处理您的“最接近”的内容。
答案 2 :(得分: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
答案 3 :(得分:0)
使用二进制搜索。如果它是一个非常大的数组,你需要实现一个更好的排序功能,如Quicksort,这样性能不会受到影响。
答案 4 :(得分:-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;
}