我想在数组中得到最接近的数字。必须是这样的:
例如,我有一个数组:[1, 3, 7, 15, 40, 55, 70, 80, 95]
数字变量:numberD1
;
如果numberD1:8 - 最接近的数字只能是7.不是15。
如果numberD1:54 - 它可能只有40.不是55。
我的意思是,我想要这样的最接近的号码。但我选择的数字不能高于最接近的数字(如Math.floor()
函数)。
抱歉我的英语不好。我希望我把问题说得好。
答案 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;
答案 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
函数不会改变原始数组。
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;
答案 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
}