JavaScript에서 배열의 최소/최대 요소를 찾습니다.

JavaScript 배열의 최소 또는 최대 요소를 쉽게 얻을 수 있는 방법은 무엇입니까?

의사 코드의 예:

let array = [100, 0, 50]
array.min() //=> 0 array.max() //=> 100 


질문에 대한 답변



대신 /을 Math.min사용할 기본 제공 어레이 개체를 추가하는 것은 어떻습니까?

Array.prototype.max = function() {
return Math.max.apply(null, this); };
Array.prototype.min = function() {
return Math.min.apply(null, this); };
let p = [35,2,65,7,8,9,12,121,33,99];
console.log(`Max value is: ${p.max()}` +
`nMin value is: ${p.min()}`);

여기 JSFiddle이 있습니다.

빌트인을 확장하면 다른 라이브러리와 충돌할 수 있으므로(일부 참조), 이 기능을 사용하면apply입력Math.xxx()어레이에 직접 연결:

var min = Math.min.apply(null, arr),
max = Math.max.apply(null, arr); 

또는 브라우저가 ECMAScript 6을 지원하는 경우 확장 구문을 사용하여apply방법:

var min = Math.min( ...arr ),
max = Math.max( ...arr ); 



var max_of_array = Math.max.apply(Math, array); 

상세한 것에 대하여는, http://aaroncrane.co.uk/2008/11/javascript_max_api/ 를 참조해 주세요.




대규모 어레이(최대 10인치 요소)의 경우,Math.min그리고.Math.max둘 다 Node.js에서 다음 오류가 발생합니다.

RangeError: 최대 콜스택 크기를 초과했습니다.

보다 견고한 솔루션은 모든 요소를 콜스택에 추가하는 것이 아니라 어레이를 전달하는 것입니다.

function arrayMin(arr) {
return arr.reduce(function (p, v) {
return ( p < v ? p : v );
}); }
function arrayMax(arr) {
return arr.reduce(function (p, v) {
return ( p > v ? p : v );
}); } 

만약 당신이 속도에 대해 우려하고, 다음 코드는~3번보다 훨씬 빠르다.Math.max.apply내 컴퓨터에 대한 거요https://jsben.ch/JPOyL. 봐

function arrayMin(arr) {
var len = arr.length, min = Infinity;
while (len--) {
if (arr[len] < min) {
min = arr[len];
}
}
return min; };
function arrayMax(arr) {
var len = arr.length, max = -Infinity;
while (len--) {
if (arr[len] > max) {
max = arr[len];
}
}
return max; }; 

만약 당신의 배열 숫자 대신에 문자열이 있는 경우 또한 숫자로 강요할 필요가 있다.그 아래 코드, 그러나~10번 나의 기계를 미뤄지게 한다.https://jsben.ch/uPipD. 봐

function arrayMin(arr) {
var len = arr.length, min = Infinity;
while (len--) {
if (Number(arr[len]) < min) {
min = Number(arr[len]);
}
}
return min; };
function arrayMax(arr) {
var len = arr.length, max = -Infinity;
while (len--) {
if (Number(arr[len]) > max) {
max = Number(arr[len]);
}
}
return max; }; 



확산 연산자 사용(ES6)

Math.max(...array)
// The same with "min" => Math.min(...array) 

const array = [10, 2, 33, 4, 5];
console.log(
Math.max(...array) )




dr;dr

// For regular arrays: var max = Math.max(...arrayOfNumbers);
// For arrays with tens of thousands of items: let max = testArray[0]; for (let i = 1; i < testArrayLength; ++i) {
if (testArray[i] > max) {
max = testArray[i];
} } 

MDN 솔루션

의 공식 MDN 문서에서는 이미 이 문제를 다루고 있습니다.

다음 함수는 Function.protype.apply()사용하여 숫자 배열의 최대 요소를 찾습니다. getMaxOfArray([1, 2, 3])와 동등하다Math.max(1, 2, 3), 단, 를 사용할 수 있습니다.getMaxOfArray()모든 크기의 프로그래밍 방식으로 구성된 어레이에서 사용할 수 있습니다.

function getMaxOfArray(numArray) {
return Math.max.apply(null, numArray); } 

또는 새로운 확산 연산자를 사용하면 어레이의 최대값을 얻는 것이 훨씬 쉬워집니다.

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

어레이의 최대 크기

MDN에 따르면apply및 확산 솔루션의 최대 인수 수 제한은 65536이었습니다.

단, 이 방법을 사용하면 JavaScript 엔진의 인수 길이 제한을 초과할 위험이 있습니다.인수가 너무 많은 함수를 적용하면(수만 개 이상의 인수를 생각할 수 있음) 그 결과는 엔진에 따라 달라집니다(JavaScriptCore의 인수 제한은 하드코드 65536).이는 제한(실제로는 과도하게 큰 스택 동작의 성질)이 지정되지 않았기 때문입니다.일부 엔진은 예외를 발생시킵니다.더 치명적인 것은 다른 사용자가 실제로 적용된 함수에 전달되는 인수 수를 임의로 제한한다는 것입니다.후자의 경우를 설명하자면, 이러한 엔진에 4개의 인수의 제한이 있는 경우(물론 실제 한계는 상당히 높음), 이는 마치 완전한 배열이 아닌 위의 예에서 5, 6, 2, 3 인수가 적용되도록 전달된 것과 같습니다.

다른 솔루션에 비해 성능이 좋지 않은 하이브리드 솔루션도 제공합니다.상세한 것에 대하여는, 이하의 퍼포먼스 테스트를 참조해 주세요.

2019년에 호출 스택의 실제 한계는 최대 크기다.현대 크롬 기반 데스크탑 브라우저에게 이것은 막상 변화가 min/max를 찾아내는 거라면 의미한다.apply번호를 아니면 확산, 실제적으로 최대 사이즈가 배열은 ~120000.이 위,는 스택 오버 플로와 다음 오류 throw 됩니다:.

RangeError: 최대 콜스택 크기를 초과했습니다.

(이 글에 기초한)아래의이라면, 해당 오류를 잡으며 당신의 특정한 환경의 한계를 계산할 수 있다.

경고!이 스크립트 실행하면 당신의 시간과 시스템의 바로 browser/system의 붕괴를 저하시킬 수 있는 성능에 따라 걸리지 않아요!

let testArray = Array.from({length: 10000}, () => Math.floor(Math.random() * 2000000)); for (i = 10000; i < 1000000; ++i) {
testArray.push(Math.floor(Math.random() * 2000000));
try {
Math.max.apply(null, testArray);
} catch (e) {
console.log(i);
break;
} }

대규모 어레이에서의 퍼포먼스

Escape Netscape 코멘트의 테스트에 근거해, 100,000개의 아이템이 있는 랜덤한 수만의 어레이로 5개의 다른 메서드를 테스트하는 벤치마크를 작성했습니다.

2019년에는 표준 루프(BTW는 크기 제한이 없음)가 어디에서나 가장 빠른 것으로 나타나며, 그 직후에 확산이 이루어지며, 그 후 MDN의 하이브리드 솔루션도 그 뒤를 잇고 있습니다.reduce제일 느려요.

어느 정도 퍼진 것을 제외하고는 거의 모든 테스트에서 동일한 결과가 나왔습니다.

어레이를 강화하여 100만 개의 아이템을 보유하게 되면 모든 것이 파손되기 시작하고 표준 루프가 고속 솔루션으로 남게 됩니다.reduce더 느리다고.

JSPerf 벤치마크

jsperf.com benchmark results for different solutions to find the min/max item of an array

JSBen 벤치마크

jsben.com benchmark results for different solutions to find the min/max item of an array

JSBench.me 벤치마크

jsbench.me benchmark results for different solutions to find the min/max item of an array

벤치마크 소스 코드

var testArrayLength = 100000 var testArray = Array.from({length: testArrayLength}, () => Math.floor(Math.random() * 2000000));
// ES6 spread Math.min(...testArray); Math.max(...testArray);
// reduce testArray.reduce(function(a, b) {
return Math.max(a, b); }); testArray.reduce(function(a, b) {
return Math.min(a, b); });
// apply Math.min.apply(Math, testArray); Math.max.apply(Math, testArray);
// standard loop let max = testArray[0]; for (let i = 1; i < testArrayLength; ++i) {
if (testArray[i] > max) {
max = testArray[i];
} }
let min = testArray[0]; for (let i = 1; i < testArrayLength; ++i) {
if (testArray[i] < min) {
min = testArray[i];
} }
// MDN hibrid soltuion // Source: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/apply#Using_apply_and_built-in_functions function minOfArray(arr) {
var min = Infinity;
var QUANTUM = 32768;
for (var i = 0, len = arr.length; i < len; i += QUANTUM) {
var submin = Math.min.apply(null, arr.slice(i, Math.min(i + QUANTUM, len)));
min = Math.min(submin, min);
}
return min; }
minOfArray(testArray);
function maxOfArray(arr) {
var max = -Infinity;
var QUANTUM = 32768;
for (var i = 0, len = arr.length; i < len; i += QUANTUM) {
var submax = Math.max.apply(null, arr.slice(i, Math.max(i + QUANTUM, len)));
max = Math.max(submax, max);
}
return max; }
maxOfArray(testArray);