
배열 고차 메서드는 배열의 각 요소에 대해 주어진 콜백 함수를 실행하는 내장 함수입니다.
for 반복문과 비교했을 때, 코드가 더 간결하고 가독성이 높으며, 무엇을(What) 할 것인지에 집중하는 선언적 프로그래밍을 가능하게 합니다.
대부분의 배열 고차 메서드는 아래와 같은 형태의 콜백 함수를 인자로 받습니다.
array.method((element, index, array) => {
// element: 처리할 현재 요소
// index: (선택 사항) 현재 요소의 인덱스
// array: (선택 사항) 메서드가 호출된 원본 배열
});
forEach()undefined. 반환값이 없으므로 새로운 배열을 생성하지 않습니다.// 콜백 함수
function callbackFunction(element, index, array) {
// 적용할 로직
}
array.forEach(callbackFunction);
element : 배열 내부의 각 원소index : 배열 내부의 각 원소의 인덱스array : 원본 배열const todos = ["숙제하기", "운동하기", "독서하기"];
todos.forEach((todo, index) => {
console.log(`${index + 1}. ${todo}`);
});
// 1. 숙제하기
// 2. 운동하기
// 3. 독서하기
map()const newArray = array.map((element, index, array) => {
// 적용할 로직
return 반환값;
});
element : 배열 내부의 각 원소index : 배열 내부의 각 원소의 인덱스array : 원본 배열const numbers = [1, 2, 3, 4, 5];
const squaredNumbers = numbers.map((num) => num * num);
console.log(squaredNumbers); // [1, 4, 9, 16, 25]
console.log(numbers); // [1, 2, 3, 4, 5] (원본 배열은 그대로 유지)
filter()true인 요소만으로 구성된 새로운 배열을 생성합니다.const newArray = array.filter((element, index, array) => {
if (조건) {
return true;
} else {
return false;
}
});
element : 배열 내부의 각 원소index : 배열 내부의 각 원소의 인덱스array : 원본 배열const todos = [
{ task: "숙제하기", completed: false },
{ task: "운동하기", completed: true },
{ task: "독서하기", completed: false },
];
const incompleteTodos = todos.filter(todo => todo.completed === false);
console.log(incompleteTodos);
// [ { task: "숙제하기", completed: false }, { task: "독서하기", completed: false } ]
find()true인 첫 번째 요소 하나를 찾습니다.undefined를 반환합니다.const newArray = array.find((element, index, array) => {
// 적용할 로직
if (조건) {
return true;
}
});
element : 배열 내부의 각 원소index : 배열 내부의 각 원소의 인덱스array : 원본 배열const todos = [
{ id: 1, task: "숙제하기" },
{ id: 2, task: "운동하기" },
{ id: 3, task: "독서하기" },
];
const targetTodo = todos.find(todo => todo.id === 2);
console.log(targetTodo); // { id: 2, task: "운동하기" }
reduce()array.reduce((accumulator, currentValue, index, array) => { ... }, initialValue)accumulator (누산기): 콜백의 반환값을 누적합니다.currentValue (현재 값): 처리할 현재 요소입니다.initialValue (초기값, 선택 사항): accumulator의 초기값입니다. 제공하지 않으면 배열의 첫 번째 요소가 사용됩니다.const newArray = array.reduce((acc, element, index, array) => {
// 적용할 로직
return 반환값;
});
acc : 누적값element : 배열 내부의 각 원소index : 배열 내부의 각 원소 인덱스array : 원본 배열const numbers = [1, 2, 3, 4, 5];
const sum = numbers.reduce((acc, current) => acc + current, 0); // 초기값 0
console.log(sum); // 15 (1+2+3+4+5)
sort()compare(a, b)가 음수를 반환하면 a가 b보다 앞에 옵니다.compare(a, b)가 양수를 반환하면 b가 a보다 앞에 옵니다.[1, 10, 2] -> [1, 10, 2])const newArray = array.sort((a, b) => {
// 정렬 기준
// a가 b보다 앞에 오게 하려면 음수 반환
// a가 b보다 뒤에 오게 하려면 양수 반환
// a가 b보다 같게 하려면 0 반환
});
const numbers = [10, 2, 5, 1, 8];
// 오름차순 정렬
numbers.sort((a, b) => a - b);
console.log(numbers); // [1, 2, 5, 8, 10]
// 내림차순 정렬
numbers.sort((a, b) => b - a);
console.log(numbers); // [10, 8, 5, 2, 1]
some() / every()some(): 배열의 요소 중 하나라도 콜백 함수의 조건을 만족하면 true를 반환합니다.every(): 배열의 모든 요소가 콜백 함수의 조건을 만족해야 true를 반환합니다.true 또는 false.some() 기본 구조const newArray = array.some((element, index, array) => {
// 적용할 로직
if (조건) {
return true;
}
});
element : 배열 내부의 각 원소index : 배열 내부의 각 원소의 인덱스array : 원본 배열every() 기본 구조const newArray = array.every((element, index, array) => {
// 적용할 로직
if (조건) {
return true;
}
});
element : 배열 내부의 각 원소index : 배열 내부의 각 원소의 인덱스array : 원본 배열const numbers = [1, 3, 5, 7, 8];
const hasEvenNumber = numbers.some(num => num % 2 === 0); // 8이 짝수이므로 true
const allOddNumbers = numbers.every(num => num % 2 !== 0); // 8 때문에 false
console.log(hasEvenNumber); // true
console.log(allOddNumbers); // false
findIndex()true인 첫 번째 요소의 인덱스를 찾습니다.const newArray = array.findIndex((element, index, array) => {
// 적용할 로직
if (조건) {
return true;
}
});
element : 배열 내부의 각 원소index : 배열 내부의 각 원소의 인덱스array : 원본 배열const todos = [
{ id: 1, task: "숙제하기" },
{ id: 2, task: "운동하기" },
{ id: 3, task: "독서하기" },
];
const targetIndex = todos.findIndex(todo => todo.id === 2);
console.log(targetIndex); // 1
map, filter와 같이 새로운 배열을 반환하는 메서드들은 연결하여(chaining) 사용할 수 있습니다.
const users = [
{ name: "Alice", age: 25, isActive: true },
{ name: "Bob", age: 17, isActive: true },
{ name: "Charlie", age: 30, isActive: false },
{ name: "David", age: 22, isActive: true },
];
// 활성 사용자 중, 20세 이상인 사람의 이름만 추출하여 대문자로 변경
const result = users
.filter(user => user.isActive && user.age >= 20) // 1. 활성 및 20세 이상 필터링
.map(user => user.name.toUpperCase()); // 2. 이름만 추출하여 대문자로 변환
console.log(result); // ["ALICE", "DAVID"]
| 메서드 | 주요 기능 | 반환값 | 원본 배열 변경 | 활용도 |
|---|---|---|---|---|
forEach() | 각 원소에 콜백 함수 적용 | undefined | ❌ | 높음 |
map() | 각 원소를 변환하여 새 배열 생성 | 새로운 배열 | ❌ | 높음 |
filter() | 조건에 맞는 원소만 필터링하여 새 배열 생성 | 새로운 배열 | ❌ | 높음 |
find() | 조건에 맞는 첫 번째 원소 찾기 | 원소 또는 undefined | ❌ | 높음 |
reduce() | 모든 원소를 순회하며 하나의 값으로 축약 | 단일 값 | ❌ | 중간 |
sort() | 원소를 정렬 | 정렬된 배열 | ✅ | 중간 |
some() | 하나라도 조건에 맞는지 확인 | true 또는 false | ❌ | 낮음 |
every() | 모든 원소가 조건에 맞는지 확인 | true 또는 false | ❌ | 낮음 |
findIndex() | 조건에 맞는 첫 번째 원소의 인덱스 찾기 | 인덱스 또는 -1 | ❌ | 낮음 |