回答:
Array.max = function( array ){
return Math.max.apply( Math, array );
};
警告:一部のVMでは引数の最大数が65535と少ないため、配列がそれほど小さいことが確実でない場合はforループを使用します。
apply
通話料金はそれを簡単に洗い流してしまいます。
RangeError: Maximum call stack size exceeded.
apply関数を使用して、Math.maxを呼び出すことができます。
var array = [267, 306, 108];
var largest = Math.max.apply(Math, array); // 306
使い方?
適用関数は、アレイとして提供所与のコンテキストと引数と、別の関数を呼び出すために使用されます。min関数とmax関数は、任意の数の入力引数を取ることができます:Math.max(val1、val2、...、valN)
だから私たちが呼び出す場合:
Math.min.apply(Math, [1,2,3,4]);
適用関数が実行されます。
Math.min(1,2,3,4);
最初のパラメーターであるコンテキストは静的なので、これらの関数にとって重要ではありません。これらはコンテキストとして渡されるものに関係なく機能します。
私はJSの専門家ではありませんが、これらのメソッドがどのように積み重なっていくのかを見たかったので、これは私にとって良い習慣でした。これが技術的にこれらをパフォーマンステストするための正しい方法であるかどうかはわかりませんが、コードで確認できるように、次々に実行しました。
0番目の値の並べ替えと取得は、最悪の方法です(配列の順序が変更されるため、望ましくない場合があります)。他の人にとっては、何百万ものインデックスを話しているのでない限り、違いは無視できます。
乱数の100,000インデックス配列での5回の実行の平均結果:
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)
jsperf tests
上記のために作成しました
配列を降順で並べ替えて、最初の項目を取得できます。
[267, 306, 108].sort(function(a,b){return b-a;})[0]
sort(function(a,b){return b-a;})
[...].sort().pop()
これはどう:
var arr = [1,2,3,4];
var largest = arr.reduce(function(x,y){
return (x > y) ? x : y;
});
console.log(largest);
どのように使用する方法についてArray.reduceを?
[0,1,2,3,4].reduce(function(previousValue, currentValue){
return Math.max(previousValue,currentValue);
});
-Infinity
。
回答のほとんどすべてが使用して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];
}
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);
最大値と最小値を見つけることは、簡単で手動の方法です。このコードは、よりもはるかに高速です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;
}
findmax()
配列に負の数しかない場合、誤った結果が返されます。findmin()
空の配列に対して誤った結果を与えます。
使用する必要がある配列内の最大数を見つけるには、次のMath.max(...arrayName);
ように機能します。
let myArr = [1, 2, 3, 4, 5, 6];
console.log(Math.max(...myArr));
詳細については、httpsMath.max
:
//developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/maxをご覧ください。
はい、もちろん存在します:Math.max.apply(null,[23,45,67,-45])
そして結果が返され67
ます。
シンプルなワンライナー
[].sort().pop()
Array
この関数を追加して、すべての配列の一部にすることもできます。
Array.prototype.max = function(){return Math.max.apply( Math, this )};
myArray = [1,2,3];
console.log( myArray.max() );
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
私は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];
}
}
array
負の数しか含まれていない場合、これは問題になります。
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;
var tmax = Math.max.apply(Math, max)
、追加する必要があります。さらに良いのは、たとえばstackoverflow.com/a/54980012/7438857のループ関数のクロージャーを使用することです。この変更により、別の質問、「多次元配列の最大数を見つける方法」、またはstackoverflow.com/questions/32616910/…でより適切に回答されます。WIP:jsfiddle.net/jamesray/3cLu9for/8。
バブルソートを使用して最大値と最小値を見つける
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]);
これを試して
function largestNum(arr) {
var currentLongest = arr[0]
for (var i=0; i< arr.length; i++){
if (arr[i] > currentLongest){
currentLongest = arr[i]
}
}
return currentLongest
}
@Quasimondoの コメントによると、これはほとんど見落とされているようですが、以下に示すように、以下が最高のパフォーマンスを発揮するようです: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;
}
1つのfor/of
ループソリューション:
const numbers = [2, 4, 6, 8, 80, 56, 10];
const findMax = (...numbers) => {
let currentMax = numbers[0]; // 2
for (const number of numbers) {
if (number > currentMax) {
console.log(number, currentMax);
currentMax = number;
}
}
console.log('Largest ', currentMax);
return currentMax;
};
findMax(...numbers);
Math.max(...[267, 306, 108]);