배열 메서드

가격 목록이 있고 각각에 세금이 추가된 두 번째 목록을 원한다고 하겠습니다. 배열을 순회하고 합계를 구한 다음 각 결과를 새 배열에 푸시하는 for 루프를 작성할 수 있습니다. 그것도 작동하지만, 작은 아이디어를 위한 많은 배선입니다: 모든 항목을 가져와서 변경합니다. 배열 메서드는 정확히 이런 종류의 작업을 위한 내장 도구입니다. 루프를 상세히 설명하지 않고도 리스트에 대해 원하는 것을 말할 수 있으며, 이 장에서는 매일 사용할 메서드들을 다룹니다. 이들은 배열과 함수를 직접 기반으로 하므로 두 가지 모두 가까이 두세요.
map: 모든 항목 변경
map은 메서드: 배열에 속하고 배열에 작업을 수행하는 함수입니다. map은 각 항목을 제공한 작은 함수를 통해 실행하고 결과를 수집하여 새 배열을 만듭니다. 해당 함수를 전달하면 각 항목을 한 번에 하나씩 전달합니다.
일부 가격이 있고 각각을 두 배로 늘리고 싶다고 하겠습니다:
const prices = [2, 4, 6];
const doubled = prices.map((price) => price * 2);
console.log(doubled); // [4, 8, 12](price) => price * 2 부분은 화살표 함수: 한 항목(price)을 가져와서 그것이 무엇이 되어야 하는지(price * 2)를 반환하는 짧은 함수입니다. map은 각 항목마다 한 번씩 호출하고 각 답을 같은 순서로 새 배열에 넣습니다.
map은 리스트를 가져와서 같은 길이의 새 리스트를 제공하며, 모든 항목이 작은 함수를 통해 실행됩니다. 화살표 함수는 각 항목이 무엇으로 변환되는지를 말하고, map은 모두를 순서대로 수행합니다. 두 번째 리스트를 만들기 위해서만 루프를 작성하는 것을 잡을 때마다 이를 사용합니다. filter: 통과하는 항목 유지
map이 모든 항목을 변경하는 경우, filter는 일부만 유지합니다. 각 항목에 대해 예 또는 아니오로 답하는 함수를 제공하면, filter는 예를 받은 항목들로만 새 배열을 만듭니다.
const scores = [40, 75, 90, 55, 88];
const passing = scores.filter((score) => score >= 60);
console.log(passing); // [75, 90, 88]함수 (score) => score >= 60은 각 점수에 대해 true 또는 false를 반환합니다. filter는 true인 것들을 유지하고 나머지는 삭제합니다. 새 배열은 원래 배열보다 짧을 수 있으며, 순서를 변경하지 않습니다.
filter는 테스트를 통과하는 항목을 유지하고 나머지는 제거하므로 새 배열은 종종 짧습니다. 함수는 각 항목에 대해 예 또는 아니오로 답하고 예만 통과합니다. 아무것도 순서를 변경하지 않으므로 생존하는 것은 시작한 순서로 유지됩니다. reduce: 한 값으로 축약
map과 filter는 모두 배열을 반환합니다. reduce는 배열을 단일 값으로 축약하는 것입니다: 합계, 최댓값, 결합된 문자열입니다. 다른 것들보다 더 많이 사람들을 혼동시키므로 천천히 가는 것이 가치가 있습니다.
reduce는 배열을 순회하면서 실행 중인 결과를 함께 전달합니다. 각 항목에서 이렇게 묻습니다: 지금까지의 결과를 고려하고 이 항목을 고려했을 때, 새로운 결과는 무엇인가요?
const prices = [10, 20, 30];
const total = prices.reduce((sum, price) => sum + price, 0);
console.log(total); // 60함수는 두 가지를 받습니다: sum, 지금까지의 실행 합계, price, 현재 항목입니다. sum + price를 반환하고, 이것이 다음 항목의 새로운 실행 합계가 됩니다. 끝의 0은 합계가 시작되는 곳입니다. 그래서 0 + 10을 계산한 다음 10 + 20, 그 다음 30 + 30으로 60에 도달합니다.
reduce는 리스트를 통해 실행 중인 결과를 전달하고 각 항목에서 업데이트합니다. 콜백은 지금까지의 결과와 현재 항목을 받고 새 결과를 반환합니다. 마지막 인수는 시작 위치이고 보통 합계는 0입니다. 단계별로 읽으면 바로 클릭되었습니다. find, some, 그리고 every
이 셋은 filter의 가까운 상대입니다: 배열에 대한 테스트를 실행하지만, 새 배열 대신 더 좁은 질문에 답합니다.
find는 모든 항목의 리스트가 아니라 테스트를 통과하는 첫 번째 항목을 제공합니다. some과 every는 전체 배열에 대해 참 또는 거짓 질문에 답합니다.
const scores = [40, 75, 90, 55];
const firstPass = scores.find((score) => score >= 60);
console.log(firstPass); // 75
const anyPass = scores.some((score) => score >= 60);
console.log(anyPass); // true
const allPass = scores.every((score) => score >= 60);
console.log(allPass); // falsefind는 첫 번째 일치하는 항목(75)을 반환합니다. some은 "어떤 항목이 통과했나?"라고 묻고 최소한 하나가 통과했으므로 true를 반환합니다. every는 "모두 통과했나?"라고 묻고 40과 55가 통과하지 못했으므로 false를 반환합니다.
find는 전체 리스트가 아니라 통과하는 첫 번째 항목을 제공합니다. some은 "어떤 항목이 통과했나?"라고 묻고 every는 "모두 통과했나?"라고 묻습니다. 둘 다 true 또는 false로 답합니다. 필터링된 배열이 아니라 하나의 항목 또는 예 또는 아니오 답변을 원할 때 이들을 사용합니다. 연결 및 읽기 가능성 유지
위의 메서드들은 결합할 때 기여하는 설계를 공유합니다: 각각은 새 값을 반환하고 원래 배열은 건드리지 않습니다.
map, filter 등은 시작한 배열을 변경하지 않습니다. 새 배열(또는 값)을 제공하고 원본은 그대로 둡니다.
const prices = [10, 20, 30];
const doubled = prices.map((price) => price * 2);
console.log(doubled); // [20, 40, 60]
console.log(prices); // [10, 20, 30]map과 filter 모두 배열을 반환하기 때문에 이들을 정렬할 수 있습니다: 먼저 필터링한 다음 생존자를 맵합니다.
const prices = [10, 20, 30, 40];
const bigDoubled = prices.filter((price) => price >= 20).map((price) => price * 2);
console.log(bigDoubled); // [40, 60, 80]filter와 map이 모두 배열을 반환하기 때문에 이들을 연결할 수 있습니다: 먼저 필터링한 다음 남은 것을 맵합니다. 위에서 아래로, 한 번에 한 단계씩 연결을 읽습니다. 여기서 어디로 갈 것인가
map, filter, reduce는 리스트로 하게 될 대부분의 것을 다룹니다: 변환하거나 좁히거나 축약합니다. find, some, every는 더 좁은 질문에 답합니다. 이들이 자연스러워지면 배열에 대한 루프의 대부분이 의도를 말하는 한 두 라인으로 변환됩니다.
자연스러운 다음 단계는 객체이고, 배열은 일반 숫자와 문자열보다 더 풍부한 항목을 유지하기 시작하며, 이 같은 메서드들이 계속 작동합니다. 여기서 콜백 구문이 흔들렸다면 함수를 다시 한 번 지나가면 나머지가 제자리를 찾을 것입니다.

