Array.prototype.map()
map 메서드는 자신을 호출한 배열의 모든 요소를 순회하면서 인수로 전달받은 콜백 함수를 반복 호출한다. 그리고 콜백 함수의 반환값들로 구성된 새로운 배열을 반환한다. 이때 원본 배열은 변경되지 않는다.
map(callbackFn)
map(callbackFn, thisArg)
매개 변수
- callbackFn : 배열의 각 요소에 대해 실행할 함수. 반환 값은 새 배열의 단일 요소로 추가. 이 함수는 다음 매개 변수들을 호출한다.
- element : 배열에서 처리 중인 현재 요소
- index : 배열에서 처리 중인 현재 요소의 인덱스
- array : 호출된 map() 배열
- thisArg(Optional) : 콜백 함수에서 this를 실행할 때 사용할 값.
반환값
각 요소가 콜백 함수의 결과인 새 배열
예제
const numbers = [1, 4, 9];
// map 메서드는 numbers 배열의 모든 요소를 순회하면서 콜백 함수를 반복 호출한다.
// 그리고 콜백 함수의 반환값들로 구성된 새로운 배열을 반환한다.
const roots = numbers.map(item => Math.sqrt(item));
// 위 코드는 다음과 같다.
// const roots = numbers.map(Math.sqrt);
// map 메서드는 새로운 배열을 반환한다.
console.log(roots); // [1, 2, 3]
// map 메서드는 원본 배열을 변경하지 않는다.
console.log(numbers); // [1, 4, 9]
forEach 메서드와 map 메서드의 공통점은 자신을 호출한 배열의 모든 요소를 순회하면서 인수로 전달받은 콜백 함수를 반복 호출한다는 것이다. 하지만 forEach 메서드는 언제나 undefined를 반환하고, map 메서드는 콜백 함수의 반환값들로 구성된 새로운 배열을 반환하는 차이가 있다. 즉, forEach 메서드는 단순히 반복문을 대체하기 위한 고차 함수이고, map 메서드는 요소값을 다른 값으로 맵핑(mapping)한 새로운 배열을 생성하기 위한 고차 함수다.
map 메서드가 생성하여 반환하는 새로운 배열의 length 프로퍼티 값은 map 메서드를 호출한 배열의 length 프로퍼티 값과 반드시 일치한다. 즉 map 메서드를 호출한 배열과 map 메서드가 생성하여 반환한 배열은 1:1 맵핑한다.
forEach 메서드와 마찬가지로 map 메서드의 콜백 함수는 map 메서드를 호출한 배열의 요소값과 인덱스, map 메서드를 호출한 배열 자체, 즉 this를 순차적으로 전달받을 수 있다. 다시 말해, map 메서드는 콜백 함수를 호출할 때 3개의 인수, 즉 map 메서드를 호출한 배열의 요소값과 인덱스 그리고 map 메서드를 호출한 배열(this)을 순차적으로 전달한다.
// map 메서드는 콜백 함수를 호출하면서 3개(요소값, 인덱스, this)의 인수를 전달한다.
[1, 2, 3].map((item, index, arr) => {
console.log(`요소값: ${item}, 인덱스: ${index}, this: ${JSON.stringify(arr)}`);
return item;
});
/*
요소값: 1, 인덱스: 0, this: [1,2,3]
요소값: 2, 인덱스: 1, this: [1,2,3]
요소값: 3, 인덱스: 2, this: [1,2,3]
*/
'JavaScript' 카테고리의 다른 글
[JavaScript] 배열 합치기 3가지 방법 (0) | 2023.06.26 |
---|---|
[JavaScript] 배열 slice 메서드 (0) | 2023.06.23 |
[JavaScript] 배열 sort 메서드 (0) | 2023.06.22 |
[JavaScript] 배열 reduce 메서드 (0) | 2023.06.20 |
[JavaScript] readline module (0) | 2023.06.18 |