获得最接近的数组

时间:2016-05-13 21:59:08

标签: javascript arrays

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

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

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

抱歉我的英语不好。我希望我把问题说得好。

5 个答案:

答案 0 :(得分:1)

你可以用这个:



// 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));
&#13;
&#13;
&#13;

答案 1 :(得分:1)

如果我理解正确的话,你是否正在寻找这样的东西,如果数组已经分类:

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

答案 2 :(得分:0)

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

通过搜索迭代,然后返回numberD1 [key - 1];

啊,我刚看到你正在寻找任意值,我相信你仍然可以找到解决方法。只需搜索其上方最接近的值,然后执行我显示的内容。

答案 3 :(得分:0)

我只是想发明Array.prototype.insert(),它从给定的索引值开始插入一系列项目并返回变异数组。功能JS需要它。但是,受此问题约束的insertNum函数不会改变原始数组。

&#13;
&#13;
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>");
&#13;
&#13;
&#13;

答案 4 :(得分:0)

这应该做的工作:

编辑 - 尽可能使用较低的号码

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
}