📄Today I Learned
map 메서드의 목적과 객체의 불변성
영진학생
2025. 1. 13. 20:09
map 메서드의 목적
map은 기존 배열을 변경하지 않고 각 요소를 변환해서 새로운 배열을 만드는 함수이다.
즉, 원본 배열을 그대로 두고, 가공한 결과를 새 배열에 담는 것이 목적!
map은 반환(return)하는 값을 모아서 새로운 배열을 만들어주기 때문에. 반환값이 명확해야 한다.
const newArray = originalArray.map((item) => {
// item을 가공해서 새로운 값을 반환
return 가공된 값;
});
const products = [
{ name: "상품1", price: 10000 },
{ name: "상품2", price: 20000 },
{ name: "상품3", price: 30000 },
];
const discountedProducts = products.map(function (product) {
return product.price -= product.price / 10;
console.log(discountedProducts);
// 이렇게 나와야 합니다 => [{ name: "상품1", price: 9000 }, ...]
위 코드는 두 가지 문제가 있다.
1. 원본 객체를 직접 수정함 (불변성 위배)
product.price -= product.price / 10은 product.price 값을 직접 변경한다.
즉. 원본 배열 products의 객체가 바뀌어버린다.
map은 원본을 수정하지 않고 새로운 배열을 만들어야 하는데, 위 코드는 원본을 훼손하게 된다.
2. map의 반환값이 올바르지 않다.
위의 코드는 숫자(수정된 가격)을 반환한다.
그런데 map은 객체를 반환해야한다.
그래서 결과가 [9000, 18000, 27000]처럼 숫자 배열이 되고,
원하는 형태인 [ { name: "상품1", price: 9000 }, ... ] 이 나오지 않게된다.
올바른 방법 : 새로운 객체를 반환
const discountedProducts = products.map(function (product) {
return {
name: product.name,
price: product.price * 0.9, // 할인된 가격
};
});
console.log(discountedProducts);
//[
{ name: "상품1", price: 9000 },
{ name: "상품2", price: 18000 },
{ name: "상품3", price: 27000 }
]
이렇게 하면 새로운 객체를 반환할수 있고, 원본 배열 products는 수정되지 않는다.