map과 filter
원본을 두고 새 배열을 만듭니다. 변형과 걸러내기를 다룹니다.
새 배열을 만들어 돌려줍니다
앞 단원의 forEach 는 값마다 무언가를 할 뿐
결과를 돌려주지 않습니다. 배열을 바탕으로 새 배열이 필요할 때가 훨씬
많습니다.
map— 값마다 바꿔 같은 개수의 새 배열을 만듭니다.filter— 조건에 맞는 것만 남겨 더 적은 새 배열을 만듭니다.
둘 다 원래 배열을 바꾸지 않습니다. 이것이 앞 단원의 방법들과 가장 다른 점입니다.
map — 값마다 바꾸기
const prices = [1000, 2000, 3000]; const discounted = prices.map(price => Math.floor(price * 0.9)); console.log(discounted); console.log(prices);
넘긴 함수가 돌려준 값이 새 배열에 담깁니다.
return 을 빠뜨리면
undefined 가 담깁니다.
filter — 조건에 맞는 것만
const scores = [85, 42, 91, 60]; const passed = scores.filter(score => score >= 60); const failed = scores.filter(score => score < 60); console.log(passed); console.log(failed); console.log(passed.length);
넘긴 함수가 true 를 돌려준 값만 남습니다. 값 자체는
바뀌지 않고 고르기만 합니다.
이어 붙이기
둘 다 배열을 돌려주므로 그 뒤에 또 붙일 수 있습니다. 왼쪽부터 차례로 실행됩니다.
const scores = [85, 42, 91, 60]; const result = scores .filter(score => score >= 60) .map(score => `${score}점`); console.log(result);
거르는 것을 먼저 두는 편이 낫습니다. 버릴 값까지 바꾸느라 헛일을 하지 않습니다.
번호도 받을 수 있습니다
const names = ["홍길동", "김철수", "이영희"]; const numbered = names.map((name, i) => `${i + 1}. ${name}`); const evenOnly = names.filter((name, i) => i % 2 === 0); console.log(numbered); console.log(evenOnly);
처음에 자주 걸리는 것
2.2 에서 본 것과 같습니다. 중괄호를 열면
return 이 필요합니다. 없으면
undefined 가 가득한 배열이 나옵니다.
prices.map(p => { p * 2; }); // [undefined, undefined, ...]
prices.map(p => p * 2); // 이렇게 적습니다
map 과 filter 는
원래 배열을 바꾸지 않고 새 배열을 돌려줄 뿐입니다. 담지 않으면
아무 일도 일어나지 않습니다.
scores.filter(s => s >= 60); // 결과가 사라집니다 const passed = scores.filter(s => s >= 60);
돌려줄 값이 없다면 forEach 가 맞습니다.
map 을 쓰면 필요 없는 배열이 만들어집니다.
직접 해보기
가격 배열을 "1000원" 형태의 배열로 바꿔
출력하세요.
1부터 10까지 담긴 배열에서 짝수만 골라 각각 제곱한 배열을 출력하세요. 배열은 직접 적어도 됩니다.
이 단원의 정리
map은 값마다 바꿔 같은 개수의 새 배열을 만듭니다.filter는 조건에 맞는 것만 남깁니다.- 둘 다 원래 배열을 바꾸지 않습니다. 결과를 담아야 합니다.
- 배열을 돌려주므로 이어 붙일 수 있습니다. 거르는 것을 먼저 둡니다.
- 돌려줄 값이 없다면
forEach가 맞습니다.