JavaScript로 숫자로 이루어진 배열을 입력받아, 그 배열 안에서 가장 작은 숫자가 위치한 인덱스를 반환하는 함수를 작성해야 하는 경우가 있습니다.
예를 들어 아래와 같은 배열이 주어졌다면, 최솟값은 -2이고 이 값의 인덱스인 6을 반환해야 합니다.
구현 예제
이 문제는 reduce() 메서드를 활용하면 깔끔하게 해결할 수 있습니다. 배열을 순회하면서 현재까지 발견된 최솟값과 그 인덱스를 함께 추적하는 방식입니다.
const arr = [3, 56, 56, 23, 7, 76, -2, 345, 45, 76, 3];
const lowestIndex = arr => {
const creds = arr.reduce((acc, val, ind) => {
let { num, index } = acc;
if(val < num){
num = val;
index = ind;
};
return { num, index };
}, {
num: Infinity,
index: -1
});
return creds.index;
};
console.log(lowestIndex(arr));코드 설명
- 초기값으로
num: Infinity와index: -1을 설정합니다. 어떤 숫자든 무한대보다 작으므로 첫 번째 요소부터 비교가 시작됩니다. reduce()가 배열의 각 요소(val)와 인덱스(ind)를 순회하며, 현재 누적된 최솟값(num)보다 작은 값이 나오면 해당 값과 인덱스를 갱신합니다.- 순회가 끝나면 객체에 저장된
index를 반환하여 최솟값의 위치를 알려줍니다.
출력 결과
콘솔에 출력되는 결과는 다음과 같습니다.
6
다른 방법: Math.min과 indexOf 활용
조금 더 간결하게 작성하고 싶다면 Math.min()으로 최솟값을 먼저 구한 뒤, indexOf()로 그 위치를 찾는 방법도 있습니다.
const lowestIndex2 = arr => arr.indexOf(Math.min(...arr)); console.log(lowestIndex2(arr)); // 6
단, 이 방식은 배열을 두 번 순회하므로 매우 큰 배열에서는 reduce()를 사용한 한 번의 순회 방식이 성능 면에서 유리합니다. 또한 중복된 최솟값이 있을 경우 두 방법 모두 가장 앞쪽(첫 번째) 인덱스를 반환한다는 점도 기억해 두면 좋습니다.