Computer >> 컴퓨터 >  >> 프로그래밍 >> JavaScript

JavaScript 배열에서 가장 작은 숫자의 인덱스 찾는 방법

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: Infinityindex: -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()를 사용한 한 번의 순회 방식이 성능 면에서 유리합니다. 또한 중복된 최솟값이 있을 경우 두 방법 모두 가장 앞쪽(첫 번째) 인덱스를 반환한다는 점도 기억해 두면 좋습니다.