0

我正在使用以下代码来查找数组中最接近的值。

var x=[0,1,2,3,4,5];
var pointX=1.5;

$.each(x, function() {
    if (closest == null || Math.abs(this - pointX) < Math.abs(closest - pointX)) {
        closest = this;
    }
});

这将返回 2。

现在考虑以下场景:

var x=[20,21,22,23,24,25]

var pointX=1.5

对于这种情况,它返回 20,但我不希望它返回,因为 1.5 不在范围 (20-25) 内。在这种情况下,它应该返回 null。我怎样才能做到这一点?

4

2 回答 2

3

尝试

function closest(x, pointX){
    var closest = null;

    if(pointX < x[0] || pointX > x[x.length -1]){
        return null
    }


    $.each(x, function(i,v) {
        if (closest == null || Math.abs(v - pointX) <= Math.abs(closest - pointX)) {
            closest = v;
        }
    });
    return closest;
}

演示:小提琴

另一种方法是对数组进行排序以确保索引正确

function closest(x, pointX){
    var closest = null, array = x.slice();

    array.sort();

    if(pointX < array[0] || pointX > array[array.length -1]){
        return null
    }

    $.each(array, function(i,v) {
        if (closest == null || Math.abs(v - pointX) <= Math.abs(closest - pointX)) {
            closest = v;
        }
    });
    return closest;
}
于 2013-05-09T09:57:32.930 回答
1

如果输入数组总是被排序,那么 Arun 的答案很好。否则这应该适合你:

function getClosest(x, pointX) {
    var closest = null;

    // Work out min and max
    var min = Math.min.apply(null, x);
    var max = Math.max.apply(null, x);

    // Only calculate closest if point is within array
    if (pointX >= min && pointX <= max) {    
        var i;
        // removed the each as it wasn't really necessary 
        for (i = 0; i < x.length; i++) {                         
            if (closest == null || Math.abs(x[i] - pointX) < Math.abs(closest - pointX)) {
                closest = x[i];
            }
        }
    }
    return closest;
}

示例 - http://jsfiddle.net/ZLd2S/

于 2013-05-09T10:08:53.290 回答