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