JavaScript에서 배열의 최소 / 최대 요소 찾기
JavaScript 배열의 최소 또는 최대 요소를 쉽게 얻을 수있는 방법은 무엇입니까?
유사 코드 예 :
let array = [100, 0, 50]
array.min() //=> 0
array.max() //=> 100
대신 Math.max
/ 를 사용하도록 내장 Array 객체를 보강하는 방법은 무엇입니까?Math.min
Array.prototype.max = function() {
return Math.max.apply(null, this);
};
Array.prototype.min = function() {
return Math.min.apply(null, this);
};
다음은 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 );
});
}
속도가 걱정된다면 다음 코드는 Math.max.apply
내 컴퓨터 보다 3 배 더 빠릅니다 . http://jsperf.com/min-and-max-in-array/2를 참조하십시오 .
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 배 느리게합니다. http://jsperf.com/min-and-max-in-array/3를 참조하십시오 .
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)
)
tl; 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 워드 프로세서Math.max()
이미이 문제를 다루고 있습니다 :
다음 함수는 Function.prototype.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의 제한 :
그러나주의하십시오.이 방법으로 apply를 사용하면 JavaScript 엔진의 인수 길이 제한을 초과 할 위험이 있습니다. 인수가 너무 많은 함수 (수만 개 이상의 인수를 생각해보십시오)를 적용한 결과는 엔진마다 다릅니다 ( JavaScriptCore는 하드 코딩 된 인수 제한이 65536 )이기 때문에 제한 (실제로 지나치게 큰 스택의 특성조차 동작)은 지정되지 않았습니다. 일부 엔진은 예외를 발생시킵니다. 더 위험한 것은 다른 사람들이 실제로 적용된 함수에 전달되는 인수의 수를 임의로 제한한다는 것입니다. 후자의 경우를 설명하기 위해 : 그러한 엔진에 4 개의 인수 제한이있는 경우 (물론 실제 제한은 훨씬 더 높음) 위의 예제에 적용하기 위해 인수 5, 6, 2, 3이 전달 된 것과 같습니다. 전체 배열보다는.
심지어 다른 솔루션에 비해 성능이 좋지 않은 하이브리드 솔루션도 제공합니다. 자세한 내용은 아래 성능 테스트를 참조하십시오.
2019 년 실제 제한은 호출 스택의 최대 크기입니다 . 최신 Chromium 기반 데스크톱 브라우저의 경우 이는 최소 / 최대를 찾을 때 apply
또는 확산 을 찾을 때 실제로 숫자 전용 배열의 최대 크기가 ~ 120000 입니다. 그 위에 스택 오버플로가 발생하고 다음 오류가 발생합니다.
RangeError : 최대 호출 스택 크기를 초과했습니다.
아래 스크립트 ( 이 블로그 게시물 기반)를 사용 하면 해당 오류를 포착하여 특정 환경에 대한 제한을 계산할 수 있습니다.
경고! 이 스크립트를 실행하려면 시간이 걸리며 시스템 성능에 따라 브라우저 / 시스템이 느려지거나 충돌 할 수 있습니다!
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;
}
}
대형 어레이에서의 성능
EscapeNetscape 의 의견 에있는 테스트를 기반으로 100000 개의 항목이 있는 난수 전용 배열 에서 5 가지 다른 방법을 테스트하는 몇 가지 벤치 마크를 만들었습니다 .
2019 년 결과는 표준 루프 (BTW에 크기 제한이 없음)가 모든 곳에서 가장 빠르다는 것을 보여줍니다 . apply
확산 은 그 뒤에 가깝게오고 그 다음에는 MDN의 하이브리드 솔루션 reduce
이 가장 느립니다.
확산이 가장 느린 이유를 제외하고 거의 모든 테스트에서 동일한 결과를 얻었습니다.
1 백만 개의 항목을 갖도록 어레이를 강화하면 문제가 발생하기 시작하고 표준 루프가 빠른 솔루션과 reduce
느린 솔루션으로 남게됩니다 .
JSPerf 벤치 마크
JSBen 벤치 마크
JSBench.me 벤치 마크
벤치 마크 소스 코드
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);
나처럼 편집증이 있다면 Math.max.apply
( MDN에 따라 큰 배열이 주어지면 오류가 발생할 수 있음 ) 다음을 시도하십시오.
function arrayMax(array) {
return array.reduce(function(a, b) {
return Math.max(a, b);
});
}
function arrayMin(array) {
return array.reduce(function(a, b) {
return Math.min(a, b);
});
}
또는 ES6에서 :
function arrayMax(array) {
return array.reduce((a, b) => Math.max(a, b));
}
function arrayMin(array) {
return array.reduce((a, b) => Math.min(a, b));
}
익명 함수는 불행하게도 필요한 (대신 사용하고 Math.max.bind(Math)
있기 때문에 reduce
단지 통과하지 못할 a
와 b
그 기능에, 또한 i
우리는 우리가 전화를하지 않도록 할 수 있도록하고, 배열 자체에 대한 참조 max
뿐만 아니라 이들에.
.apply
의도가 인수 값 목록과 함께 가변 함수를 호출하려는 경우에 자주 사용됩니다.
이 Math.max([value1[,value2, ...]])
함수는 0 개 이상의 숫자 중 가장 큰 숫자를 반환합니다.
Math.max(10, 20); // 20
Math.max(-10, -20); // -10
Math.max(-10, 20); // 20
이 Math.max()
메서드는 배열을 전달할 수 없습니다. 당신이 값 목록이있는 경우 그 중 당신이 가장 큰 얻을 필요가, 당신은 일반적으로 사용하여이 함수를 호출 할 Function.prototype.apply의 () , 예를
Math.max.apply(null, [10, 20]); // 20
Math.max.apply(null, [-10, -20]); // -10
Math.max.apply(null, [-10, 20]); // 20
그러나 ECMAScript 6 부터 스프레드 연산자를 사용할 수 있습니다 .
스프레드 연산자를 사용하면 여러 인수 (함수 호출 용) 또는 여러 요소 (배열 리터럴 용)가 예상되는 위치에서 표현식을 확장 할 수 있습니다.
스프레드 연산자를 사용하여 위의 내용을 다음과 같이 다시 작성할 수 있습니다.
Math.max(...[10, 20]); // 20
Math.max(...[-10, -20]); // -10
Math.max(...[-10, 20]); // 20
가변 연산자를 사용하여 함수를 호출 할 때 추가 값을 추가 할 수도 있습니다.
Math.max(...[10, 20], 50); // 50
Math.max(...[-10, -20], 50); // 50
보너스:
Spread 연산자를 사용하면 ES5 push
에서 splice
, 등 의 조합을 사용하여 명령형 코드로 대체해야하는 상황에서 배열 리터럴 구문을 사용하여 새 배열을 만들 수 있습니다 .
let foo = ['b', 'c'];
let bar = ['a', ...foo, 'd', 'e']; // ['a', 'b', 'c', 'd', 'e']
배열 유형을 확장하여 수행합니다.
Array.max = function( array ){
return Math.max.apply( Math, array );
};
Array.min = function( array ){
return Math.min.apply( Math, array );
};
여기 에서 부스트 됨 (John Resig에 의해)
Array
요소 의 최소값을 찾는 간단한 해결책 은 Array
prototype 함수 를 사용하는 것입니다 reduce
.
A = [4,3,-9,-2,2,1];
A.reduce((min, val) => val < min ? val : min, A[0]); // returns -9
또는 JavaScript의 내장 Math.Min () 함수 사용 (@Tenflex에게 감사드립니다) :
A.reduce((min,val) => Math.min(min,val), A[0]);
이 설정 min
에 A[0]
이어서, 및 검사 용 A[1]...A[n]
엄격히 적은 전류를 초과하는지 여부 min
. 경우 A[i] < min
다음 min
에 업데이트됩니다 A[i]
. 모든 배열 요소가 처리되면 min
결과로 반환됩니다.
두 가지 방법이 더 짧고 쉽습니다.
let arr = [2, 6, 1, 0]
// Way 1:
let max = Math.max.apply(null, arr)
//Way 2:
let max = arr.reduce(function(a, b) {
return Math.max(a, b);
});
다른 사람들은 이미 그들이 증가하는 몇 가지 솔루션을 제공했습니다 Array.prototype
. 이 답변에서 내가 원하는 것은 Math.min.apply( Math, array )
또는 이어야하는지 명확히하는 것 Math.min.apply( null, array )
입니다. 그래서 문맥 것은 사용되어야한다 Math
나 null
?
null
에 컨텍스트로 전달할 때 apply
컨텍스트는 기본적으로 전역 개체 ( window
브라우저의 경우 개체)로 설정됩니다. Math
객체를 컨텍스트로 전달하는 것이 올바른 해결책이지만 전달하는 null
것도 문제가되지 않습니다 . 다음 null
은 Math.max
함수를 장식 할 때 문제를 일으킬 수 있는 예입니다 .
// decorate Math.max
(function (oldMax) {
Math.max = function () {
this.foo(); // call Math.foo, or at least that's what we want
return oldMax.apply(this, arguments);
};
})(Math.max);
Math.foo = function () {
print("foo");
};
Array.prototype.max = function() {
return Math.max.apply(null, this); // <-- passing null as the context
};
var max = [1, 2, 3].max();
print(max);
위의 경우 this.foo
는로 평가 되므로 예외 window.foo
가 발생 undefined
합니다. 우리가 교체 할 경우 null
에 Math
예상 문자열 "foo는"이 화면에 인쇄 될 것 같은 상황이 작동합니다 (I이 사용하여 테스트 모질라 코뿔소 ).
아무도 Math.max
그렇게 장식하지 않았다고 생각할 수 있습니다 null
. 패스 는 문제없이 작동합니다.
한 가지 더 방법 :
var arrayMax = Function.prototype.apply.bind(Math.max, null);
용법:
var max = arrayMax([2, 5, 1]);
https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/Math/max
function getMaxOfArray(numArray) {
return Math.max.apply(null, numArray);
}
var arr = [100, 0, 50];
console.log(getMaxOfArray(arr))
이것은 나를 위해 일했습니다.
나는 감소 기능을 언급하지 않은 것에 놀랐다.
var arr = [1, 10, 5, 11, 2]
var b = arr.reduce(function(previous,current){
return previous > current ? previous:current
});
b => 11
arr => [1, 10, 5, 11, 2]
이것은 귀하의 목적에 적합 할 수 있습니다.
Array.prototype.min = function(comparer) {
if (this.length === 0) return null;
if (this.length === 1) return this[0];
comparer = (comparer || Math.min);
var v = this[0];
for (var i = 1; i < this.length; i++) {
v = comparer(this[i], v);
}
return v;
}
Array.prototype.max = function(comparer) {
if (this.length === 0) return null;
if (this.length === 1) return this[0];
comparer = (comparer || Math.max);
var v = this[0];
for (var i = 1; i < this.length; i++) {
v = comparer(this[i], v);
}
return v;
}
큰 배열 (~ 10⁷ 요소)의 경우 Math.min
, Math.max
node.js에서 RangeError (최대 호출 스택 크기 초과)를 처리합니다.
큰 어레이의 경우 빠르고 더러운 솔루션은 다음과 같습니다.
Array.prototype.min = function() {
var r = this[0];
this.forEach(function(v,i,a){if (v<r) r=v;});
return r;
};
나는 같은 문제가 있었고 배열의 최소값과 최대 값을 얻어야했고 놀랍게도 배열에 대한 내장 함수가 없었습니다. 많이 읽은 후 "상위 3"솔루션을 직접 테스트하기로 결정했습니다.
- 이산 솔루션 : 현재 최대 및 / 또는 최소 값에 대해 배열의 모든 요소를 확인하는 FOR 루프;
- 솔루션 적용 : apply (null, array)를 사용하여 배열을 Math.max 및 / 또는 Math.min 내부 함수로 보냅니다.
- REDUCE 솔루션 : reduce (function)을 사용하여 배열의 모든 요소에 대한 검사를 반복합니다.
테스트 코드는 다음과 같습니다.
function GetMaxDISCRETE(A)
{ var MaxX=A[0];
for (var X=0;X<A.length;X++)
if (MaxX<A[X])
MaxX=A[X];
return MaxX;
}
function GetMaxAPPLY(A)
{ return Math.max.apply(null,A);
}
function GetMaxREDUCE(A)
{ return A.reduce(function(p,c)
{ return p>c?p:c;
});
}
어레이 A는 100,000 개의 임의의 정수로 채워졌고, 각 기능은 Windows Vista가 설치된 인텔 펜티엄 4 2.99GHz 데스크탑의 Mozilla Firefox 28.0에서 10,000 번 실행되었습니다. 시간은 performance.now () 함수로 검색되는 초 단위입니다. 결과는 다음과 같으며 3 개의 소수 자릿수와 표준 편차가 있습니다.
- 이산 솔루션 : 평균 = 0.161s, sd = 0.078
- 솔루션 적용 : mean = 3.571s, sd = 0.487
- REDUCE 솔루션 : 평균 = 0.350s, sd = 0.044
REDUCE 솔루션은 개별 솔루션보다 117 % 더 느 렸습니다. APPLY 솔루션은 이산 솔루션보다 2,118 % 더 느 렸습니다. 게다가 Peter가 관찰 한 것처럼 큰 배열 (약 1,000,000 개 이상의 요소)에서는 작동하지 않습니다.
또한 테스트를 완료하기 위해이 확장 된 개별 코드를 테스트했습니다.
var MaxX=A[0],MinX=A[0];
for (var X=0;X<A.length;X++)
{ if (MaxX<A[X])
MaxX=A[X];
if (MinX>A[X])
MinX=A[X];
}
타이밍 : mean = 0.218s, sd = 0.094
따라서 단순한 이산 솔루션보다 35 % 더 느리지 만 최대 값과 최소값을 동시에 검색합니다 (다른 솔루션은 검색하는 데 최소 두 배가 걸립니다). OP에 두 값이 모두 필요하면 이산 솔루션이 최선의 선택이 될 것입니다 (하나는 최대 계산 용이고 다른 하나는 최소 계산 용으로 두 개의 개별 함수로도 두 번째로 좋은 REDUCE 솔루션보다 성능이 뛰어남).
프로젝트 어디에서나 다음 기능을 사용할 수 있습니다.
function getMin(array){
return Math.min.apply(Math,array);
}
function getMax(array){
return Math.max.apply(Math,array);
}
그런 다음 배열을 전달하는 함수를 호출 할 수 있습니다.
var myArray = [1,2,3,4,5,6,7];
var maximo = getMax(myArray); //return the highest number
다음 코드가 저에게 효과적입니다.
var valueList = [10,4,17,9,3];
var maxValue = valueList.reduce(function(a, b) { return Math.max(a, b); });
var minValue = valueList.reduce(function(a, b) { return Math.min(a, b); });
Math.min 및 Math.max
Math.min
하고는 Math.max
모두 재귀 작업 가능성이 가장 높은 crach (~ 10⁷ 항목 이상) 큰 배열.
대신 다음과 같이 오래된 자바 스크립트 루프를 사용할 수 있습니다.
function getMinMax(arr) {
return arr.reduce(({min, max}, v) => ({
min: min < v ? min : v,
max: max > v ? max : v,
}), { min: arr[0], max: arr[0] });
}
또는 (더 나은 런타임) :
function getMinMax(arr) {
let min = arr[0];
let max = arr[0];
let i = arr.length;
while (i--) {
min = arr[i] < min ? arr[i] : min;
max = arr[i] > max ? arr[i] : max;
}
return { min, max };
}
* 1,000,000 개 항목으로 테스트 :
참고로 1 차 기능 실행 시간 (내 컴퓨터에서)은 15.84ms 였고 2 차 기능은 4.32ms에 불과했습니다.
반복하면서 계속 추적하십시오.
var min = null;
var max = null;
for (var i = 0, len = arr.length; i < len; ++i)
{
var elem = arr[i];
if (min === null || min > elem) min = elem;
if (max === null || max < elem) max = elem;
}
alert( "min = " + min + ", max = " + max );
배열에 요소가없는 경우 최소 / 최대 null이됩니다. 배열에 요소가 있으면 한 번에 최소 및 최대를 설정합니다.
range
재사용을 허용하고 가독성을 향상시키기 위해 위 의 방법을 사용하여 Array를 확장 할 수도 있습니다 . http://jsfiddle.net/9C9fU/ 에서 작동하는 바이올린을 참조하십시오.
Array.prototype.range = function() {
var min = null,
max = null,
i, len;
for (i = 0, len = this.length; i < len; ++i)
{
var elem = this[i];
if (min === null || min > elem) min = elem;
if (max === null || max < elem) max = elem;
}
return { min: min, max: max }
};
사용
var arr = [3, 9, 22, -7, 44, 18, 7, 9, 15];
var range = arr.range();
console.log(range.min);
console.log(range.max);
간단하고 이해하기 쉬운 솔루션을 공유하겠다고 생각했습니다.
분 동안 :
var arr = [3, 4, 12, 1, 0, 5];
var min = arr[0];
for (var k = 1; k < arr.length; k++) {
if (arr[k] < min) {
min = arr[k];
}
}
console.log("Min is: " + min);
그리고 최대 :
var arr = [3, 4, 12, 1, 0, 5];
var max = arr[0];
for (var k = 1; k < arr.length; k++) {
if (arr[k] > max) {
max = arr[k];
}
}
console.log("Max is: " + max);
정말 간단한 것입니다.
var arr = [10,20,30,40];
arr.max = function() { return Math.max.apply(Math, this); }; //attach max funct
arr.min = function() { return Math.min.apply(Math, this); }; //attach min funct
alert("min: " + arr.min() + " max: " + arr.max());
다음은 객체 배열에서 최대 값을 얻는 한 가지 방법입니다. 복사본 (슬라이스 포함)을 만든 다음 복사본을 내림차순으로 정렬하고 첫 번째 항목을 가져옵니다.
var myArray = [
{"ID": 1, "Cost": 200},
{"ID": 2, "Cost": 1000},
{"ID": 3, "Cost": 50},
{"ID": 4, "Cost": 500}
]
maxsort = myArray.slice(0).sort(function(a, b) { return b.ID - a.ID })[0].ID;
Math.max()
또는 사용Math.min()
Math.max(10, 20); // 20
Math.min(-10, -20); // -20
다음 함수는 Function.prototype.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); // 3
var min = Math.min(...arr); // 1
ChaosPandion의 솔루션은 프로토 타입을 사용하는 경우 작동합니다. 그렇지 않은 경우 다음을 고려하십시오.
Array.max = function( array ){
return Math.max.apply( Math, array );
};
Array.min = function( array ){
return Math.min.apply( Math, array );
};
위는 배열 값이 정수가 아닌 경우 NaN을 반환하므로이를 방지하기 위해 일부 기능을 빌드해야합니다. 그렇지 않으면 작동합니다.
prototype.js 프레임 워크를 사용하는 경우 다음 코드가 정상적으로 작동합니다.
arr.min();
arr.max();
여기에 문서화 : max 용 자바 스크립트 프로토 타입 프레임 워크
sugar.js 라이브러리를 사용하는 경우 제안한대로 arr.min () 및 arr.max () 를 작성할 수 있습니다 . 숫자가 아닌 배열에서 최소값과 최대 값을 가져올 수도 있습니다.
min (map, all = false) 배열에서 가장 낮은 값을 가진 요소를 반환합니다. map은 확인할 값을 매핑하는 함수이거나 단축키 역할을하는 문자열 일 수 있습니다. 모두 참이면 배열의 모든 최소값을 반환합니다.
max (map, all = false) 배열에서 가장 큰 값을 가진 요소를 반환합니다. map은 확인할 값을 매핑하는 함수이거나 단축키 역할을하는 문자열 일 수 있습니다. 모두 참이면 배열의 모든 최대 값을 반환합니다.
예 :
[1,2,3].min() == 1
['fee','fo','fum'].min('length') == "fo"
['fee','fo','fum'].min('length', true) == ["fo"]
['fee','fo','fum'].min(function(n) { return n.length; }); == "fo"
[{a:3,a:2}].min(function(n) { return n['a']; }) == {"a":2}
['fee','fo','fum'].max('length', true) == ["fee","fum"]
Lo-Dash 및 underscore.js 와 같은 라이브러리 도 유사한 강력한 최소 및 최대 기능을 제공합니다.
Lo-Dash의 예 :
_.max([4, 2, 8, 6]) == 8
var characters = [
{ 'name': 'barney', 'age': 36 },
{ 'name': 'fred', 'age': 40 }
];
_.max(characters, function(chr) { return chr.age; }) == { 'name': 'fred', 'age': 40 }
let arr = [2,5,3,5,6,7,1];
let max = Math.max(...arr); // 7
let min = Math.min(...arr); // 1
시험
let max= a=> a.reduce((m,x)=> m>x ? m:x);
let min= a=> a.reduce((m,x)=> m<x ? m:x);
let max= a=> a.reduce((m,x)=> m>x ? m:x);
let min= a=> a.reduce((m,x)=> m<x ? m:x);
// TEST - pixel buffer
let arr = Array(200*800*4).fill(0);
arr.forEach((x,i)=> arr[i]=100-i%101);
console.log('Max', max(arr));
console.log('Min', min(arr))
Math.min / max (+ apply)의 경우 오류가 발생합니다.
최대 호출 스택 크기 초과 (Chrome 74.0.3729.131)
// TEST - pixel buffer
let arr = Array(200*800*4).fill(0);
arr.forEach((x,i)=> arr[i]=100-i%101);
// Exception: Maximum call stack size exceeded
try {
let max1= Math.max(...arr);
} catch(e) { console.error('Math.max :', e.message) }
try {
let max2= Math.max.apply(null, arr);
} catch(e) { console.error('Math.max.apply :', e.message) }
// same for min
참고 URL : https://stackoverflow.com/questions/1669190/find-the-min-max-element-of-an-array-in-javascript
'developer tip' 카테고리의 다른 글
module.exports 대 Node.js의 내보내기 (0) | 2020.09.30 |
---|---|
옵션 추가 (0) | 2020.09.30 |
Python의 easy_install로 설치된 패키지를 제거하려면 어떻게해야합니까? (0) | 2020.09.30 |
macOS Mojave 업데이트 후 Git이 작동하지 않음 (xcrun : 오류 : 잘못된 활성 개발자 경로 (/ Library / Developer / CommandLineTools)) (0) | 2020.09.30 |
입력 유형 = "날짜"형식을 변경하는 방법이 있습니까? (0) | 2020.09.30 |