找到数组

时间:2017-11-26 16:00:53

标签: javascript jquery arrays

我认为我想要的很简单,但我找不到正确的解决方案。

我在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);

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

谢谢!

4 个答案:

答案 0 :(得分:4)

如果你对数组进行了排序,并且足够小,那么一个非常简单的模式可以按你想要的方式简单地迭代数组直到number > number-in-array然后返回前一个位置的数字。

function getClosestValue(myArray, myValue){
    //optional
    var i = 0;

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

    return myArray[--i];
}

问候。

答案 1 :(得分:1)

另一种解决方案是过滤数组以找到最接近的较小值,然后将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));

答案 2 :(得分:0)

您可以使用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

答案 3 :(得分:0)

反转数组并使用find

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