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 に答える