选择小于数组中变量的最大数字

时间:2012-08-22 10:04:38

标签: javascript arrays

我有一个JavaScript数组和一个像这样的变量;

var a = [0, 1200, 3260, 9430, 13220],
    b = 4500;

选择数组中仍然小于或等于变量的最大值的最明智的方法是什么?

在此示例中,我需要选择3260

我可以做这样的事情;

$.each(a, function(i){
    if(a[i] <= b && a[i+1] > b){
        var c = a[i];
        return false;
    }
});

但我认为如果选定的数组值是最后一个,那么可能无效。更不用说,对我而言,看起来很多代码都非常简单。

是否有更智能/更简洁的方法来实现我的目标?

(是的,我知道我不应该使用jQuery循环,但在输入示例时我很懒)

6 个答案:

答案 0 :(得分:8)

另一种方法是通过数组过滤和apply()的组合,我认为这是一种非常易读的方法。 对filter()的调用只返回一个不满足谓词函数的元素数组,然后apply()调用Math.max,每个元素作为参数。

var a = [1, 2, 3, 4, 5];
var b = 4;
var result = Math.max.apply(Math, a.filter(function(x){return x <= b}));

结果将等于4.

答案 1 :(得分:3)

var max = Number.MIN_VALUE;
for (var i = 0; i < a.length; i++) { 
  if (a[i] <= b && a[i] > max) { 
    max = a[i]; 
  } 
}

我认为上述方法非常简单,易读且不够冗长。另一种方法是使用reduce,如下所示:

var max = a.reduce(function (i, j) { return j <= b ? Math.max(i, j) : i }, Number.MIN_VALUE);

答案 2 :(得分:2)

数组总是排序吗?在这种情况下,您可以沿着这些行优化代码(您可能想检查索引,我还没有检查代码):

var beginning = 0;
var end = a.length;
while ((end-beginning)>1) {
    var currentIndex = Math.floor((beginning+end)/2);;
    if (a[currentIndex] < b) {
        beginning = currentIndex;
    } else if (a[currentIndex] > b){
        end = currentIndex;
    } else {
        beginning=end=currentIndex;
    }
}
var max = a[beginning];

答案 3 :(得分:2)

jQuery的grep()

 var a = [0, 1200, 3260, 9430, 13220],
 b = 4500; 
 var c= Math.max.apply( Math,$.grep(a,function(n){return n<=b}));
 document.write(c)

WORKING DEMO

答案 4 :(得分:1)

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

jQuery变体,如果由于某种原因需要它。

答案 5 :(得分:1)

以下应该:

function getHigh(arr, max){
  var c;
  for(var i = 0, len=arr.length; i<len; i++){
    if(a[i] <= b) c=a[i];
    else return c;
  }
  return false;
}