在 Javascript 中将数字与集合中最接近的数字相匹配

Spa*_*nja 4 javascript arrays algorithm

我有一个值数组,我需要一个接受两个整数的函数,并将这两个整数分配给数组中最接近的值。

var bandwidthSteps = [0.128, 0.256, 0.512, 1, 2, 4, 5, 8, 10, 12, 15, 18, 20, 22, 25, 30, 40, 50, 55, 60, 80, 90, 100, 110, 128, 200, 256, 300, 350, 400, 450, 500];
Run Code Online (Sandbox Code Playgroud)

当出现“私有”值和“访客”值时,我需要将每个值与集合中最接近的值相匹配 - 向下舍入。

var function = closestValues(private,guest) {
    //
};
Run Code Online (Sandbox Code Playgroud)

所以当这个函数给出 14 和 21 时,我需要函数返回:

private = 15
guest = 20
Run Code Online (Sandbox Code Playgroud)

因为这些是与数组中的整数最接近的匹配。注意数组中的“步数”是不规则的,不是2、5、8、11这样的。不然就容易了。

JS 函数中的解决方案会很棒,或者是制作这样的函数的正确方向。我想到的想法似乎过于复杂:对于数组中的每组两个连续数字,对这两个数字进行平均,然后确定给定的整数是否大于或小于平均值,等等。我确信还有更多简洁的方式。

Nin*_*olz 5

您可以迭代数组并检查绝对增量和最后一个增量。

function closestValue(v) {
    var value,
        lastDelta;

    bandwidthSteps.some(function (a) {
        var delta = Math.abs(v - a);
        if (delta >= lastDelta) {
            return true;
        }
        value = a;
        lastDelta = delta;
    });
    return value;
}

var bandwidthSteps = [0.128, 0.256, 0.512, 1, 2, 4, 5, 8, 10, 12, 15, 18, 20, 22, 25, 30, 40, 50, 55, 60, 80, 90, 100, 110, 128, 200, 256, 300, 350, 400, 450, 500];

console.log(closestValue(14));
console.log(closestValue(21));
Run Code Online (Sandbox Code Playgroud)