숫자로 이루어진 배열 내에서 가장 큰 숫자 혹은 가장 작은 숫자를 찾아야 할 경우 FOR문을 돌리는 단순한 방법 외에 두 가지 방법이 더 존재한다.
먼저 Math 객체를 사용하는 방법이 있다. Math 객체에 가장 큰 숫자, 작은 숫자를 구하는 max, min 메서드가 존재하는데 여기에 apply 메서드를 사용하면 숫자로 이루어진 배열을 파라메터로 전달할 수 있게 된다. 아래의 예를 보자.
Math.max.apply(null, 배열); // 최대값
Math.min.apply(null, 배열); //최소값
var test = [0, 77, 33, 11, 99, 88, 55];
Math.max.apply(null, test); //결과값은 99
Math.min.apply(null, test); //결과값은 0
한 가지 조심해야할 부분이 있는데, 배열 내에 비교 불가능한 값이 있다면 결과는 NaN 으로 나오게 됨을 주의해야 한다.
대부분의 경우에는 Math 객체를 이용해도 무리없이 결과를 얻을 수 있지만 큰 배열(~10⁷ elements) 정도되면, Math.min 과 Math.max 를 사용할 경우, "RangeError: Maximum call stack size exceeded" 오류가 나게 된다.
Math 객체를 이용하지 않고 더 메모리 소모도 적은 아래와 같은 방법도 있다.
var array = [1, 10, 5, 11, 2];
//최대값
var max = array.reduce( function (previous, current) {
return previous > current ? previous:current;
});
//최소값
var min = array.reduce( function (previous, current) {
return previous > current ? current:previous;
});
이 외에도 아래와 같이 slice와 sort 등 Array 객체의 내장 메서드만을 사용한 방법도 존재한다.
var min = [1, 20, 11, 88, 3].slice(0).sort(function(a,b){a>b})[0];
var max = [1, 20, 11, 88, 3].slice(0).sort(function(a,b){a<b})[0];
["b","a","d","c"].slice(0).sort()[0]; //"a"
["b","a","d","c"].slice(0).sort().reverse()[0]; //"d"
["b","a","d","c"].slice(0).sort(function(a,b){return a > b;})[0]; //"a"
["b","a","d","c"].slice(0).sort(function(a,b){return a < b;})[0]; //"d"