获取最接近的数组数

Get closest number of array

本文关键字:数组 最接近 获取      更新时间:2023-09-26

我想得到数组中最接近的数字。它必须是这样的:
例如,我有一个数组:[1, 3, 7, 15, 40, 55, 70, 80, 95]

数字变量:numberD1
If numberD1:8-最接近的数字只能是7。不是15。
如果数字D1:54-它只能是40。不是55。

我的意思是,我想要这样最接近的数字。但我选择的数字不能高于最接近的数字(如Math.floor()函数)。

抱歉我英语不好。我希望我能很好地解决我的问题。

您可以使用这个:

// sample array
a = [1, 3, 7, 15, 40, 55, 70, 80, 95]
// get right number
function getClosest(a, numberD1) {
    return numberD1 - a.reduce(function(closest, v) {
        return numberD1 >= v ? Math.min(numberD1-v, closest) : closest;
    }, 1e100);
}  
// output result
document.write(8 + ' => ' + getClosest(a, 8));
document.write('<br>');
document.write(54 + ' => ' + getClosest(a, 54));

如果我理解正确,如果数组排序为:

var list = ...
var numberD1 = ...
var result = null;
for (var i = 0; i < list.length(); i++){
    if (list[i] <= numberD1)
        numberD1 = list[i];
}
return result;

假设你的数组已经排序,我认为理论上你可以搜索指定的值,然后返回它前面的值?

通过搜索进行循环,然后返回numberD1[key-1];

啊,我刚刚看到你在搜索任何任意的值,我相信你仍然可以找到绕过它的方法。只需搜索上面最接近的值,然后按照我显示的操作。

这应该完成任务:

编辑-如果可能的话,注意得到一个更低的数字

function closest(num, array){
var closest = Infinity
    for (var i = 0; i < array.length; i++)
        if (closest < num){
            if (array[i] < num && array[i] > closest)
                closest = array[i]
        }
        else if (array[i] < num || array[i] < closest)
            closest = array[i]
    return closest != Infinity? closest :null
}

我只是想发明Array.prototype.insert(),它插入从给定索引值开始的一系列项,并返回突变数组。功能JS需要它。然而,受此问题影响的insertNum函数不会使原始数组发生突变。

Array.prototype.insert = function(i,...rest) {
  this.splice(i,0,...rest)
  return this
}
var arr = [1, 3, 7, 15, 40, 55, 70, 80, 95];
var insertNum = (a,n) => a.slice(0)
                          .insert(a.reduce((p,c,i) => {var d = Math.abs(n-c);
                                                       p[0] > d && (p[0] = d, p[1] = n > c ? i+1 : i);
                                                       return p} ,[Infinity,0])[1],n);
document.writeln("<pre>" + JSON.stringify(insertNum(arr,8)) + "</pre>");
document.writeln("<pre>" + JSON.stringify(insertNum(arr,54)) + "</pre>");