underscore.js의 _.each는 break할 수 없습니다
결론부터 말씀드리면, _.each 메서드로는 반복문을 중간에 탈출(break)할 수 없습니다. _.each는 자바스크립트 네이티브 메서드인 forEach의 동작 방식을 그대로 따르기 때문인데, 원래 forEach 자체도 예외(exception)를 던지는 것 외에는 루프를 빠져나갈 방법을 제공하지 않습니다.
그렇다면 조건이 충족되었을 때 반복을 멈추고 싶다면 어떻게 해야 할까요? 아래에서 소개하는 두 가지 대안적인 방법을 사용하면 됩니다.
방법 1: _.find를 사용하여 조건 충족 시 루프 종료하기
_.find는 배열을 순회하다가 콜백 함수가 true를 반환하는 순간 즉시 반복을 멈추고 해당 요소를 반환합니다. 이 특성을 활용하면 사실상 break와 동일한 효과를 낼 수 있습니다.
_.find([1, 2, 3, 4], (element) => {
// 여기서 조건을 검사합니다
if (element === 2) {
return true; // true 반환 시 루프가 즉시 중단됩니다
}
// 각 요소에 대해 원하는 작업을 수행합니다
// ...
});위 예제에서는 요소가 2일 때 true를 반환하므로, 그 이후의 요소(3, 4)에 대해서는 더 이상 순회하지 않습니다.
방법 2: 예외(Exception)를 던져서 each 탈출하기
꼭 _.each를 사용해야 하는 상황이라면, 콜백 함수 내부에서 의도적으로 예외를 발생시키고 이를 try-catch로 감싸는 방법도 있습니다.
try {
_([1, 2, 3, 4]).each((element) => {
// 여기서 조건을 검사합니다
if (element === 2) {
throw new Error(); // 예외 발생으로 루프 강제 종료
}
// 각 요소에 대해 원하는 작업을 수행합니다
// ...
})
}
catch (e) {
// 아무 작업도 하지 않고 넘어갑니다.
}예외를 던지면 _.each의 내부 반복이 즉시 중단되고, 제어 흐름이 catch 블록으로 넘어갑니다. 다만 이 방식은 코드의 가독성을 해치고 성능상 오버헤드가 있을 수 있으므로, 가능하다면 첫 번째 방법인 _.find 사용을 권장합니다.
정리
_.each는 네이티브forEach와 마찬가지로break나return으로 루프를 중단할 수 없습니다.조건 충족 시 반복을 멈추려면
_.find를 사용하는 것이 가장 깔끔한 방법입니다.부득이하게
_.each를 유지해야 한다면 예외를 던지는 방식으로 탈출할 수 있습니다.