Lodash의 _.indexOf 간단 정리.
_.indexOf = function(array, target) {
var result = -1;
_.each(array, function(item, index) {
if (item === target && result === -1) {
result = index;
}
});
return result;
};
일단 _.each는
_.each = function(collection, iterator) {
if (Array.isArray(collection)) {
for (let i = 0; i < collection.length; i++) {
iterator(collection[i], i, collection);
}
} else {
for (const key in collection) {
iterator(collection[key], key, collection);
}
}
};
이렇게 써놨다.
반환값은 없고 배열 또는 객체를 훑으면서 각 요소를 콜백함수에 넣는다.
입력값이 배열일 때 콜백함수의 첫 번째 매개변수는 요소, 둘째는 인덱스, 셋째는 해당 배열이다.
그럼 다시 _.indexOf로 돌아가면 이 함수는 매개변수로 배열(array)과 찾는 값(target)을 받는다.
최초 result 값을 -1로 지정한다. 찾는 값이 배열에 없으면 -1을 반환하기 위해서다.
그리고 요소들을 차례차례 콜백함수에 넣는다. 콜백함수의 매개변수는 요소(item)와 인덱스(i).
특정 요소 값이 찾는 값과 같으면(item === target) result에 인덱스를 담는 방식인데 조건에 result === -1이 있다.
result === -1을 지우고 함수를 돌려봤더니 찾는 값이 배열 속에 여러 개가 있을 때 가장 마지막 인덱스를 반환한다.
즉 _.indexOf는 찾는 값이 배열의 어느 지점에서 가장 먼저 나오는지 판별하기 위해 조건으로 (item === target && result === -1)을 걸었다.
const arr = [1, 1, 2];
_.indexOf(arr, 1);
이런 코드가 돌아가는 과정을 생각해 보면
- 최초 result = -1
- arr[0]이 target인 1과 같고 result가 -1이므로 조건식 true, result = 0으로 바뀜
- arr[1]이 target과 같지만 더 이상 result가 -1이 아니므로 조건식 false, result 계속 0
- arr[2]이 target과 다르므로 result 여전히 0
- result 0 반환
&&가 왼쪽부터 falsey 값을 찾고 falsey 값이 나오면 해당 피연산자를, falsey 값이 끝까지 안 나오면 마지막 피연산자를 내보내는 성질을 사용한 것이다.
'TIL > 자바스크립트' 카테고리의 다른 글
addEventListener와 for, 이벤트리스너가 마지막 반복 결과값에만 붙는 문제 [자바스크립트] (0) | 2020.06.21 |
---|---|
querySelectorAll getElementsByClassName 등 복수 선택 메소드와 addEventListener [자바스크립트] (0) | 2020.06.13 |
함수를 실행하고 결과값을 담는 위치 및 시점 [자바스크립트] (0) | 2020.06.11 |
배열 섞기, 피셔-예이츠 셔플 ft. 숫자야구게임 [자바스크립트] (1) | 2020.06.07 |
배열 slice와 splice [자바스크립트] (0) | 2020.06.06 |