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

JavaScript로 2차원 배열의 각 부분 배열에서 최댓값 추출하기

문제 소개

다음과 같이 숫자로 이루어진 2차원 배열(배열 안에 배열이 중첩된 형태)이 있다고 가정해 보겠습니다.

const arr = [
[1, 16, 34, 48],
[6, 66, 2, 98],
[43, 8, 65, 43],
[32, 98, 76, 83],
[65, 89, 32, 4],
];

이 배열을 순회하면서 각 하위(내부) 배열에서 가장 큰 요소(최댓값)를 추출하고, 그 값들로만 구성된 새로운 배열을 반환하는 함수를 작성해야 합니다.

즉, 위 배열에 대한 기대 결과는 다음과 같습니다.

const output = [
48, // 첫 번째 하위 배열의 최댓값
98,
65,
98,
89 // 마지막 하위 배열의 최댓값
];

해결 방법: map() + Math.max()

이 문제는 Array.prototype.map()Math.max()를 조합하면 매우 간결하게 해결할 수 있습니다. map()은 원본 배열을 변경하지 않고 각 요소를 변환한 새로운 배열을 반환하므로, 하위 배열별 최댓값 목록을 만드는 데 적합합니다.

const arr = [
[1, 16, 34, 48],
[6, 66, 2, 98],
[43, 8, 65, 43],
[32, 98, 76, 83],
[65, 89, 32, 4],
];

const constructBig = arr => {
return arr.map(sub => Math.max(...sub));
};

console.log(constructBig(arr));

코드 동작 원리

  • arr.map(sub => ...) — 바깥쪽 배열을 순회하면서 각 하위 배열 sub에 대해 콜백 함수를 실행합니다.
  • Math.max(...sub) — 전개(spread) 연산자 ...를 사용해 하위 배열의 요소들을 개별 인수로 펼쳐 Math.max()에 전달하고, 그중 최댓값을 계산합니다.
  • map()의 반환값 — 각 하위 배열의 최댓값으로 채워진 새 배열입니다.

실행 결과

위 코드를 실행하면 콘솔에 다음과 같은 출력이 나타납니다.

[ 48, 98, 65, 98, 89 ]

참고: reduce()를 사용한 대안

전개 연산자 없이 reduce()를 사용해도 동일한 결과를 얻을 수 있습니다.

const constructBig = arr =>
arr.map(sub => sub.reduce((max, n) => (n > max ? n : max), -Infinity));

성능 팁: 요소 수가 수만 개 이상인 매우 긴 하위 배열에는 전개 연산자 방식이 호출 스택 한도 초과 오류를 일으킬 수 있으므로, 이 경우 reduce() 방식이 더 안전합니다. 일반적인 크기의 배열이라면 두 방법 모두 문제없이 동작합니다.