web-dev-qa-db-ja.com

JavaScript配列に含まれる最大数を見つけるにはどうすればよいですか?

いくつかの数字を含む単純なJavaScript配列オブジェクトがあります。

[267, 306, 108]

この配列で最大数を見つける関数はありますか?

194
dotty

救助に出かける:

Array.max = function( array ){
    return Math.max.apply( Math, array );
};

警告VMによっては引数の最大数が65535であるため であるため、forループを使用します配列がそれほど小さいかどうかはわかりません。

302
Crescent Fresh

Apply関数を使用して、 Math.max を呼び出すことができます。

var array = [267, 306, 108];
var largest = Math.max.apply(Math, array); // 306

使い方?

apply 関数は、配列として提供される、指定されたコンテキストと引数で別の関数を呼び出すために使用されます。 minおよびmax関数は、任意の数の入力引数を取ることができます:Math.max(val1、val2、...、valN)

したがって、次のように呼び出すと:

Math.min.apply(Math, [1,2,3,4]);

適用機能が実行されます:

Math.min(1,2,3,4);

これらの関数は静的であるため、最初のパラメーターであるコンテキストは重要ではありません。コンテキストとして渡されるものに関係なく機能します。

191
CMS

新しい スプレッド演算子 を使用した最も簡単な構文:

var arr = [1, 2, 3];
var max = Math.max(...arr);

ソース: Mozilla MDN

44
A.I

大きな配列(〜100k要素)の場合、実際には単純なforループで配列を反復処理するだけで、Math.max.apply()よりも〜30%優れたパフォーマンスが得られることがわかりました。

function mymax(a)
{
    var m = -Infinity, i = 0, n = a.length;

    for (; i != n; ++i) {
        if (a[i] > m) {
            m = a[i];
        }
    }

    return m;
}

ベンチマーク結果

36
Ja͢ck

私はJSの専門家ではありませんが、これらのメソッドがどのように積み重なるかを確認したかったので、これは私にとって良いプラクティスでした。これが技術的にこれらを性能テストするのに技術的に正しい方法であるかどうかはわかりませんが、私のコードでわかるように、それらを次々に実行しました。

0番目の値を並べ替えて取得することは、間違いなく最悪の方法です(そして、配列の順序が変更されるため、望ましくない場合があります)。他の人にとっては、数百万のインデックスを話さない限り、違いは無視できます。

乱数の100,000インデックス配列を使用した5回の実行の平均結果:

  • 削減にかかった4.0392ms実行する
  • Math.max.applyの実行には.3742ms
  • ソートして0番目の値を取得するには67.4724msを実行しました
  • Reduce()内のMath.maxは実行に6.5804msを要しました
  • カスタムfindmax関数は1.6102msの実行にかかりました

var performance = window.performance

function findmax(array)
{
  var max = 0,
      a = array.length,
      counter

  for (counter=0;counter<a;counter++)
  {
      if (array[counter] > max)
      {
          max = array[counter]
      }
  }
  return max
}

function findBiggestNumber(num) {
  var counts = []
  var i
  for (i = 0; i < num; i++) {
    counts.Push(Math.random())
  }

  var a, b

  a = performance.now()
  var biggest = counts.reduce(function(highest, count){
        return highest > count ? highest : count
      }, 0)
  b = performance.now()
  console.log('reduce took ' + (b - a) + ' ms to run')

  a = performance.now()
  var biggest2 = Math.max.apply(Math, counts)
  b = performance.now()
  console.log('Math.max.apply took ' + (b - a) + ' ms to run')

  a = performance.now()
  var biggest3 = counts.sort(function(a,b){return b-a;})[0]
  b = performance.now()
  console.log('sorting and getting the 0th value took ' + (b - a) + ' ms to run')

  a = performance.now()
  var biggest4 = counts.reduce(function(highest, count){
        return Math.max(highest,count)
      }, 0)
  b = performance.now()
  console.log('Math.max within reduce() took ' + (b - a) + ' ms to run')

  a = performance.now()
  var biggest5 = findmax(counts)
  b = performance.now()
  console.log('custom findmax function took ' + (b - a) + ' ms to run')
  console.log(biggest + '-' + biggest2 + '-' + biggest3 + '-' + biggest4 + '-' + biggest5)

}

findBiggestNumber(1E5)
35
redOctober13

配列を降順に並べ替えて、最初の項目を取得できます。

[267, 306, 108].sort(function(a,b){return b-a;})[0]
27
Gumbo

これはどう:

var arr = [1,2,3,4];

var largest = arr.reduce(function(x,y){
       return (x > y) ? x : y;
});

console.log(largest);
24
brroshan

Array.reduce を使用してはどうですか?

[0,1,2,3,4].reduce(function(previousValue, currentValue){
  return Math.max(previousValue,currentValue);
});
8
CodeToad

ほとんどすべての答えはMath.max.apply()を使用します。これは素敵でダンディですが、制限があります。

関数の引数は、マイナス面-制限があるスタックに配置されます。したがって、配列が制限よりも大きい場合、RangeError: Maximum call stack size exceeded.で失敗します

コールスタックサイズを見つけるには、次のコードを使用しました。

var ar = [];
for (var i = 1; i < 100*99999; i++) {
  ar.Push(1);
  try {
    var max = Math.max.apply(Math, ar);
  } catch(e) {
    console.log('Limit reached: '+i+' error is: '+e);
    break;
  }
}

私のマシンのFireFoxで最大であることが証明されました-591519。つまり、配列に591519を超えるアイテムが含まれている場合、Math.max.apply()RangeErrorになります。

この問題の最善の解決策は、反復的な方法です(クレジット: https://developer.mozilla.org/ ):

max = -Infinity, min = +Infinity;

for (var i = 0; i < numbers.length; i++) {
  if (numbers[i] > max)
    max = numbers[i];
  if (numbers[i] < min)
    min = numbers[i];
}

この質問についてブログに書いています here

5
lukas.pukenis

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/max

const inputArray = [ 1, 3, 4, 9, 16, 2, 20, 18];
const maxNumber = Math.max(...inputArray);
console.log(maxNumber);
5
Abhijeet

最大値と最小値を簡単かつ手動で見つけます。このコードはMath.max.applyよりもはるかに高速です。配列で最大1000k個の数値を試しました。

function findmax(array)
{
    var max = 0;
    var a = array.length;
    for (counter=0;counter<a;counter++)
    {
        if (array[counter] > max)
        {
            max = array[counter];
        }
    }
    return max;
}

function findmin(array)
{
    var min = array[0];
    var a = array.length;
    for (counter=0;counter<a;counter++)
    {
        if (array[counter] < min)
        {
            min = array[counter];
        }
    }
    return min;
}
4
Yaser Ranjha

はい、もちろん存在します:Math.max.apply(null,[23,45,67,-45])および結果は67を返します。

3
user3702000

Math.max(...arrayName);を使用するだけで配列内の最大数を見つけるには、次のように機能します。

let myArr = [1, 2, 3, 4, 5, 6];
console.log(Math.max(...myArr));

したがって、基本的に配列内で最大の数を取得し、コンソールに出力します。トリプルドットを使用すると、基本的にMath.max([1, 2, 3, 4, 5, 6]);と書いてしまいます。

2
Samuel Chen

Arrayを拡張してこの関数を作成し、すべての配列の一部にすることもできます。

Array.prototype.max = function(){return Math.max.apply( Math, this )};
myArray = [1,2,3];

console.log( myArray.max() );
1
Izz

私はJSで始めましたが、この方法は良いと思います:

var array = [34, 23, 57, 983, 198];<br>
var score = 0;

for(var i = 0; i = array.length; i++) {
  if(array[ i ] > score) {
    score = array[i];
  }
}
1
Jakub Karki

これを試すことができます、

var arr = [267,306,108];
var largestNum = 0;
for(i=0;i<arr.length;i++) {
   if(arr[i]>largest){
    var largest = arr[i];
   }
}
console.log(largest);
1
Aasha joney

forEach を使用することもできます。

var maximum = Number.MIN_SAFE_INTEGER;

var array = [-3, -2, 217, 9, -8, 46];
array.forEach(function(value){
  if(value > maximum) {
    maximum = value;
  }
});

console.log(maximum); // 217
1

Function.prototype.bindを使用してラップを実行できることを忘れないでください。これにより、「すべてネイティブ」なfunctionが得られます。

var aMax = Math.max.apply.bind(Math.max, Math);
aMax([1, 2, 3, 4, 5]); // 5
1
Paul S.

使用-Array.prototype.reduce()はクールです!

[267, 306, 108].reduce((acc,val)=> (acc>val)?acc:val)

ここでacc =アキュムレータおよびval =現在の値;

var a = [267, 306, 108].reduce((acc,val)=> (acc>val)?acc:val);

console.log(a);
1
arora

多次元配列の最大数を見つける

var max = []; 

for(var i=0; arr.length>i; i++ ){

   var arra = arr[i];
   var largest = Math.max.apply(Math, arra);
   max.Push(largest);

   }
return max;
0
Liveindream

これを試して

function largestNum(arr) {
  var currentLongest = arr[0]

  for (var i=0; i< arr.length; i++){
    if (arr[i] > currentLongest){
      currentLongest = arr[i]
    }
  }

  return currentLongest
}
0
Toufiq

これを実行します:

Array.prototype.max = function(){
    return Math.max.apply( Math, this );
};

そして今[3,10,2].max()を試して10を返します

0
RegarBoy

@Quasimondoの comment によりますが、これはほとんど見逃されているようですが、以下に示すように、以下のパフォーマンスが最高のようです: https://jsperf.com/finding-maximum-element -in-an-array 。問題の配列の場合、パフォーマンスに大きな影響はないかもしれませんが、大きな配列の場合はパフォーマンスがより重要になります。また、 前述のように 配列の長さが長い場合はMath.max()を使用しても機能しません65535未満。 この回答 も参照してください。

function largestNum(arr) {
    var d = data;
    var m = d[d.length - 1];
    for (var i = d.length - 1; --i > -1;) {
      if (d[i] > m) m = d[i];
    }
    return m;
}
0
James Ray

バブルソートを使用して最大値と最小値を見つける

    var arr = [267, 306, 108];

    for(i=0, k=0; i<arr.length; i++) {
      for(j=0; j<i; j++) {
        if(arr[i]>arr[j]) {
          k = arr[i];
          arr[i] = arr[j];
          arr[j] = k;
        }
      }
    }
    console.log('largest Number: '+ arr[0]);
    console.log('Smallest Number: '+ arr[arr.length-1]);
0
Mano