몇 개의 숫자를 포함하는 간단한 JavaScript Array 객체가 있습니다.
[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
어떻게 작동합니까?
은 적용 함수 배열로 제공 주어진 컨텍스트와 인수와 다른 함수를 호출하는데 사용된다. 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 회 실행 한 평균 결과 :
- 했다 줄일 4.0392ms를 실행
- Math.max.apply 를 실행하는 데 3.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)
답변
더 큰 배열 (~ 100k 요소)의 경우 실제로는 다음 for
보다 ~ 30 % 더 나은 성능 을 보이는 겸손한 루프로 배열을 반복하는 것으로 지불합니다 Math.max.apply()
.
function mymax(a)
{
var m = -Infinity, i = 0, n = a.length;
for (; i != n; ++i) {
if (a[i] > m) {
m = a[i];
}
}
return m;
}
답변
배열을 내림차순으로 정렬하고 첫 번째 항목을 가져올 수 있습니다.
[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);