JavaScript의 lastIndexOf() 함수는 인자로 전달받은 요소가 배열에 존재할 경우, 해당 요소가 마지막으로 등장하는 위치의 인덱스를 반환합니다. 만약 요소가 배열에 존재하지 않는다면 -1을 반환합니다.
예를 들어 다음과 같습니다.
[3, 5, 3, 6, 6, 7, 4, 3, 2, 1].lastIndexOf(3) // 결과: 7
배열 [3, 5, 3, 6, 6, 7, 4, 3, 2, 1]에서 숫자 3은 인덱스 0, 2, 7 세 곳에 존재하므로, 마지막 등장 위치인 7이 반환됩니다.
구현 목표
이번 글에서는 기존에 내장되어 있는 lastIndexOf() 함수와 동일한 기능을 수행하는 JavaScript 함수를 직접 작성해 보겠습니다. 그리고 작성한 함수로 기본 lastIndexOf() 함수를 재정의(override)하여, 실제 내장 함수처럼 동작하도록 만들 것입니다.
구현 방법
핵심 로직은 매우 간단합니다. 배열의 끝에서부터 앞쪽으로 순회하면서 찾고자 하는 요소를 발견하는 즉시 그 인덱스를 반환하면 됩니다. 끝부터 탐색하기 때문에 자연스럽게 '마지막 등장 위치'를 얻을 수 있습니다. 만약 끝까지 순회했는데도 요소를 찾지 못했다면 -1을 반환합니다.
예제 코드
다음은 전체 구현 코드입니다.
const arr = [3, 5, 3, 6, 6, 7, 4, 3, 2, 1];
Array.prototype.lastIndexOf = function(el) {
for (let i = this.length - 1; i >= 0; i--) {
if (this[i] !== el) {
continue;
}
return i;
}
return -1;
};
console.log(arr.lastIndexOf(3));코드 설명
- 순회 방향: 반복문은
this.length - 1, 즉 배열의 마지막 인덱스에서 시작해 0까지 역방향으로 진행됩니다. - 요소 비교: 현재 인덱스의 값이 찾으려는 값과 일치하지 않으면
continue로 건너뜁니다. - 일치 시 반환: 값이 일치하는 순간 해당 인덱스를 즉시 반환하므로, 항상 가장 뒤에 있는 인덱스가 결과가 됩니다.
- 미발견 처리: 반복문이 모두 종료될 때까지 일치하는 요소가 없다면
-1을 반환합니다.
실행 결과
위 코드를 실행하면 콘솔에 다음과 같은 출력이 나타납니다.
7
배열에서 숫자 3이 마지막으로 등장하는 인덱스인 7이 정상적으로 출력되는 것을 확인할 수 있습니다. 이처럼 간단한 역방향 순회만으로 내장 lastIndexOf()와 동일하게 동작하는 함수를 손쉽게 구현할 수 있습니다.