9

我有一个 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 循环,但我在输入示例时很懒)

4

6 回答 6

11

另一种方法是通过数组过滤和 apply() 的组合,我认为这是一种非常易读的方法。对 filter() 的调用仅返回 a 中不满足谓词函数的元素数组,然后 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。

于 2012-08-22T10:23:57.397 回答
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);
于 2012-08-22T10:09:37.923 回答
2

a 数组是否总是排序的?在这种情况下,您可以按照这些行优化您的代码(您可能想要检查索引,我没有检查代码):

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];
于 2012-08-22T10:19:42.990 回答
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)

工作演示

于 2012-08-22T10:33:21.393 回答
1
var closest = null;
$.each(a, function() {
    if ( closest == null || Math.abs(this - b) < Math.abs(closest - b) ) {
        closest = this;
    }
});

如果出于某种原因需要 jQuery 变体。

于 2012-08-22T10:19:19.907 回答
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;
}

于 2012-08-22T10:20:34.703 回答