寻找数组中最接近但小于指定值的数

9

我认为我需要的东西很简单,但是我无法找到正确的解决方案。

我在Javascript中有这样一种数组:

[0, 38, 136, 202, 261, 399]

当我点击按钮时,会生成一个0到600之间的值。我需要在这个数组中找到最接近但小于该值的数。

例如,如果生成的值为198,我希望得到136作为结果。如果生成的值为300,我想要261……如果是589,我想要399等等。

到目前为止,我尝试了以下代码:

var theArray = [ 1, 3, 8, 10, 13 ];
var goal = 7;
var closest = null;

$.each(theArray, function(){
    if (closest == null || Math.abs(this - goal) < Math.abs(closest - goal)) {
        closest = this;
    }
});

alert(closest);

但它只返回最接近的值...现在我需要获取给定数字的最接近且较小的值...我如何改进我的算法以满足我的需求?

谢谢!


1
你的数组是否总是有序的? - PM 77-1
忘记提到了,是的,它将始终按照示例的顺序进行排序。;-) - fraxool
3
&& goal - this > 0 可能有效。 - fen1x
1
如果目标值低于数组中的任何数字,您希望结果是什么? - John
请检查我的答案并告诉我是否正确。 - Mayur Agarwal
显示剩余3条评论
4个回答

13

数组倒序并使用 find

let arr = [0, 38, 136, 202, 261, 399];
let val = 300;
let number = arr.reverse().find(e => e <= val);
console.log(number);


1
非常好的答案。谢谢! - Emir Memic

7
如果您的数组已排序,并且足够小,想要实现您想要的功能非常简单,只需在数组上迭代,直到number > number-in-array,然后返回前一个位置的数字即可。
function getClosestValue(myArray, myValue){
    //optional
    var i = 0;

    while(myArray[++i] < myValue);

    return myArray[--i];
}

Regards.


你需要初始化 i 吗? - PM 77-1
1
如果在代码的任何时候都没有定义 i,JS 将使用默认值 "undefined" 进行初始化;然后,由于您将其视为数字,它将假定默认值为 0。请注意,由于是 ++i(抱歉我弄错了代码,我正在修复它),第一次访问将在 myArray[1] 处进行。如果您想要,也可以对其进行初始化,这没有问题 :) - David Solé González

3
另一种解决方案是过滤数组以找到最接近的较小值,然后使用带有展开运算符的 Math.max() 函数:
// Array to select value
let array = [0, 38, 136, 202, 261, 399];

// Random value
let random = 168;

// Filtering array with closest smaller values [0, 38, 136]
let filtered = array.filter(num => num <= random);

// The closest value will be the maximum
let closest = Math.max(...filtered);


在一行代码中:
let closest = Math.max(...array.filter(num => num <= random));

1
你可以使用Array#some,如果项目大于或等于所需值,则退出。否则将实际值分配为返回值。
这个提案适用于排序数组。

function getClosest(array, value) {
    var closest;
    array.some(function (a) {
        if (a >= value) {
            return true;
        }
        closest = a;
    });
    return closest;
}

var array = [0, 38, 136, 202, 261, 399];

console.log(getClosest(array, 100)); //  38
console.log(getClosest(array, 198)); // 136
console.log(getClosest(array, 300)); // 261
console.log(getClosest(array, 589)); // 399


不错!some()函数是否遍历整个数组中的所有项?当函数条件为真时,它是否停止运行? - Amir Meimari
1
如果回调函数返回一个真值,则停止执行。 - Nina Scholz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接