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

もう 1 つの方法は、配列フィルタリングと 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

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 に答える
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];
于 2012-08-22T10:19:42.990 に答える
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 に答える
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 に答える