JavaScript 개발을 하다 보면 여러 개의 불리언(Boolean) 배열을 하나의 배열로 합쳐야 하는 경우가 종종 있습니다. 예를 들어 다음과 같은 2차원 불리언 배열이 있다고 가정해 보겠습니다.
const arr = [[true,false,false],[false,false,false],[false,false,true]];
여기서 우리가 작성해야 할 함수는 각 하위 배열의 대응되는 위치에 있는 요소들을 AND(&&) 연산자로 결합하여, 하나의 1차원 배열로 병합하는 것입니다.
접근 방식
이 문제는 Array.prototype.reduce() 메서드를 활용하면 깔끔하게 해결할 수 있습니다. reduce()를 사용하면 배열의 각 요소(하위 배열)를 순회하면서 누적값(acc)에 대응 인덱스별 AND 연산 결과를 저장할 수 있습니다.
구현 코드
const arr = [[true,false,false],[false,false,false],[false,false,true]];
const andMerge = (arr = []) => {
return arr.reduce((acc, val) => {
val.forEach((bool, ind) => {
acc[ind] = acc[ind] && bool || false;
});
return acc;
}, []);
};
console.log(andMerge(arr));코드 설명
- reduce()의 초기값으로 빈 배열([])을 지정합니다.
- 각 하위 배열(val)을 forEach로 순회하면서, 현재 인덱스(ind)에 해당하는 누적값과 현재 불리언 값을 AND 연산합니다.
acc[ind] && bool || false표현식은 undefined와의 연산 시 발생할 수 있는 오류를 방지하고, 결과가 falsy일 경우 항상 false를 반환하도록 보장합니다.
실행 결과
위 코드를 실행하면 콘솔에 다음과 같은 출력이 나타납니다.
[ false, false, false ]
결과를 살펴보면 첫 번째 인덱스는 true && false && false = false, 두 번째 인덱스는 모두 false이므로 false, 세 번째 인덱스 역시 false || false || true에서 앞의 false 때문에 최종적으로 false가 됩니다. 따라서 모든 요소가 false인 배열이 출력되는 것이 정상적인 동작입니다.