いくつかの数字を含む単純なJavaScript配列オブジェクトがあります。
[267, 306, 108]
この配列で最大数を見つける関数はありますか?
Array.max = function( array ){
return Math.max.apply( Math, array );
};
警告: VMによっては引数の最大数が65535であるため であるため、forループを使用します配列がそれほど小さいかどうかはわかりません。
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);
これらの関数は静的であるため、最初のパラメーターであるコンテキストは重要ではありません。コンテキストとして渡されるものに関係なく機能します。
大きな配列(〜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;
}
私は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)
配列を降順に並べ替えて、最初の項目を取得できます。
[267, 306, 108].sort(function(a,b){return b-a;})[0]
これはどう:
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);
});
ほとんどすべての答えは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 。
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;
}
はい、もちろん存在します:Math.max.apply(null,[23,45,67,-45])
および結果は67
を返します。
Math.max(...arrayName);
を使用するだけで配列内の最大数を見つけるには、次のように機能します。
let myArr = [1, 2, 3, 4, 5, 6];
console.log(Math.max(...myArr));
したがって、基本的に配列内で最大の数を取得し、コンソールに出力します。トリプルドットを使用すると、基本的にMath.max([1, 2, 3, 4, 5, 6]);
と書いてしまいます。
Array
を拡張してこの関数を作成し、すべての配列の一部にすることもできます。
Array.prototype.max = function(){return Math.max.apply( Math, this )};
myArray = [1,2,3];
console.log( myArray.max() );
私は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];
}
}
これを試すことができます、
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);
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
Function.prototype.bind
を使用してラップを実行できることを忘れないでください。これにより、「すべてネイティブ」なfunctionが得られます。
var aMax = Math.max.apply.bind(Math.max, Math);
aMax([1, 2, 3, 4, 5]); // 5
使用-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);
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;
これを試して
function largestNum(arr) {
var currentLongest = arr[0]
for (var i=0; i< arr.length; i++){
if (arr[i] > currentLongest){
currentLongest = arr[i]
}
}
return currentLongest
}
これを実行します:
Array.prototype.max = function(){
return Math.max.apply( Math, this );
};
そして今[3,10,2].max()
を試して10
を返します
@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;
}
バブルソートを使用して最大値と最小値を見つける
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]);