find·some·every·reduce
배열에서 찾고, 판정하고, 하나의 값으로 모읍니다.
찾고, 판정하고, 모읍니다
앞 단원의 둘은 배열을 돌려줬습니다. 이 단원의 넷은 배열이 아닌 것을 돌려줍니다.
find— 조건에 맞는 첫 값을 돌려줍니다.some— 하나라도 맞으면 참입니다.every— 모두 맞아야 참입니다.reduce— 값들을 하나로 모읍니다.
find — 첫 값 하나
const scores = [42, 58, 85, 91]; console.log(scores.find(score => score >= 60)); console.log(scores.find(score => score >= 100)); console.log(scores.findIndex(score => score >= 60));
filter 와 다릅니다.
filter 는 맞는 것을 모두 담은 배열을,
find 는 첫 값 하나를 돌려줍니다. 없으면
undefined 입니다.
findIndex 는 값 대신 번호를 돌려줍니다. 없으면
-1 입니다.
some 과 every — 참인가 거짓인가
const stocks = [3, 0, 7]; console.log(stocks.some(stock => stock === 0)); console.log(stocks.every(stock => stock > 0)); console.log(stocks.some(stock => stock > 100)); console.log(stocks.every(stock => stock >= 0));
some 은 맞는 것을 만나면 그 자리에서 멈추고,
every 는 안 맞는 것을 만나면 멈춥니다. 끝까지 돌지
않습니다.
reduce — 하나로 모으기
가장 낯선 것이 reduce 입니다. 함수 하나와
시작 값을 받아, 값마다 그 함수를 부르며 결과를 이어 나갑니다.
const prices = [1000, 2000, 500]; const total = prices.reduce((sum, price) => sum + price, 0); console.log(total);
sum 은 지금까지 모은 값이고
price 는 이번 값입니다. 돌려준 것이 다음 회차의
sum 이 됩니다. 마지막 0
이 시작 값입니다.
const prices = [1000, 2000, 500]; const total = prices.reduce((sum, price) => { console.log(`${sum} + ${price} = ${sum + price}`); return sum + price; }, 0); console.log(`합계 ${total}`);
reduce 로 최댓값 구하기
모으는 것이 합계일 필요는 없습니다. 지금까지 본 것 중 큰 쪽을 이어 나가면 최댓값이 됩니다.
const scores = [42, 91, 58]; const best = scores.reduce((max, score) => score > max ? score : max, 0); const count = scores.reduce((n) => n + 1, 0); console.log(best); console.log(count);
최댓값은 Math.max 로도 되지만, 모으는 방식을 바꾸면
무엇이든 만들 수 있다는 것이 reduce 의 쓸모입니다.
처음에 자주 걸리는 것
돌려준 값이 다음 회차로 넘어갑니다. 빠뜨리면 두 번째 회차부터
undefined 를 받습니다.
prices.reduce((sum, p) => { sum + p; }, 0); // NaN 이 나옵니다
시작 값을 빼면 첫 값이 시작 값이 되어 회차가 하나 줄어듭니다. 빈 배열에서는 오류까지 납니다. 언제나 시작 값을 적으세요.
TypeError: Reduce of empty array with no initial value
find 는 값 하나,
filter 는 배열입니다. 하나를 기대하고
filter 를 쓰면 배열이 나와 그다음 코드가
어긋납니다.
직접 해보기
재고 수 배열에서 품절(0)이 하나라도 있는지, 그리고 모두 재고가 있는지를 각각 출력하세요.
점수 배열의 평균을 reduce 로 구해 출력하세요.
빈 배열이면 0 입니다.
이 단원의 정리
find는 첫 값 하나, 없으면undefined입니다.some은 하나라도,every는 모두 맞아야 참입니다.reduce는 값들을 하나로 모읍니다. 돌려준 것이 다음 회차로 넘어갑니다.reduce에는 언제나 시작 값을 적습니다.- 모으는 방식을 바꾸면 합계·최댓값·개수 무엇이든 만들 수 있습니다.