Notice
Recent Posts
Recent Comments
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Tags
more
Today
Total
관리 메뉴

차차로그

JS 반복 map(), filter(), reduce() 본문

JavaScript

JS 반복 map(), filter(), reduce()

차차한 2022. 8. 12. 13:54

map()

배열.map(value, index, array => 리턴값);
value는 필수값, index와 array는 선택값
배열의 각 요소에 대하여 주어진 함수를 수행한 결과를 모아 새로운 배열을 반환한다!

    const nums = [1,2,3,4,5];
    let numMap = nums.map(val => val * 2);
    console.log(numMap);

nums 배열의 각 요소에 모두 2를 곱한 후 그 배열을 반환한다.

결과 : [2,4,6,8,10]

numMap = nums.map((val, idx, arr) => {
        console.log("value = ", val, "index = ", idx, "array = ", arr);
        console.log(val * 3);
    });

nums를 길이만큼 반복하기 때문에 각 요소, 인덱스, 원 배열을 확인하는 것도 가능

    value =  1 index =  0 array =  Array(5)
    3
    value =  2 index =  1 array =  Array(5)
    6
    value =  3 index =  2 array =  Array(5)
    9
    value =  4 index =  3 array =  Array(5)
    12
    value =  5 index =  4 array =  Array(5)

 

filter()

배열.filter((value, index, array) => 리턴값);
value는 필수값, index와 array는 선택값
배열의 각 요소에 대해 주어진 함수의 결과가 true인 요소만 모아 새로운 배열을 반환한다!
map은 무조건 반환이지만 filter는 boolean 체크를 해서 true인 값만 배열에 담아 반환하는 차이점이 있다.

const nums = [1,2,3,4,5];
let numFilter = nums.filter(val => val > 2);
console.log(numFilter);

화살표 옆의 조건을 true로 통과한 val값만 새로운 배열에 저장된다.

val이 2보다 큰 값만 조건을 통과하기 때문에 1과 2는 새 배열에 담길 수 없다.

따라서 결과는 [3,4,5]가 된다.

   const lit = ['apple', 'banana', 'cat', 'dog', 'eleven', 'five'];
   litFilter = lit.filter(val => val.length > 4);
   console.log(litFilter);

lit 배열엔 총 6개의 값이 있지만 

filter에서 값의 길이가 4보다 커야만 조건을 통과해 새 배열에 담길 수 있기 때문에 

litFilter에는 ['apple', 'banana', 'eleven']만 담길 수 있다.

 

reduce()

배열.reduce((accumulator, currentValue, currentIndex, array) => {},초기값);

reduce는 배열의 길이만큼 반복을 하면서 값을 리턴해 그것을 accumulator에 더할 수 있다.

최종적으로는 모든 값이 더해진 accumulator를 리턴한다.

accumulator, currentValue는 필수값, currentIndex, array는 선택값

초기값은 입력하게 되면 초기값부터 계산이 시작되고, 생략 시 배열의 첫 번째 요소부터 계산이 된다.

    const nums = [1,2,3,4,5,6,7,8,9,10];
    let numFilter = nums.reduce((acc, val) => acc + val);
    console.log(numFilter);

숫자가 담긴 배열 nums를 길이만큼 반복하면서 acc에 acc+val를 계속 담는다.

마치 acc += acc + val인 모습과도 같다.

초기값을 생략했기 때문에 1부터 더해져 결과적으로 55를 리턴한다.

    const nums = [1,2,3,4,5,6,7,8,9,10];
    let numFilter = nums.reduce((acc, val) => acc + val, 10);
    console.log(numFilter);

만약에 acc의 초기값으로 10을 주게 되면 acc에 이미 10이 할당된 상태로 값이 계속 누적되기 때문에

65를 리턴하게 된다.

    const nums = [1,2,3,4,5,6,7,8,9,10];
    let numFilter = nums.reduce((acc, val) => val);
    console.log(numFilter);

만약에 acc+val로 쓰지 않고 그냥 val만 쓰게 된다면 

nums[0] 때 acc = 1이 되고 nums[1] 때 acc = 2가 되는 식으로 값이 누적되지 않는다.

따라서 제일 마지막 밸류 값인 10을 리턴하게 된다.

filter() 사용
    numFilter = nums.filter(val => val % 2 == 0)
    console.log(numFilter); // [2, 4, 6, 8, 10]

=============================================================================================
reduce() 사용
	numFilter = nums.reduce((acc, val) => {
        if(val % 2 == 0){
            acc.push(val);
        }
        return acc;
    },[]);
    console.log(numFilter); // [2, 4, 6, 8, 10]

reduce는 map이나 filter처럼 사용할 수도 있다.

위의 코드는 reduce를 filter처럼 사용한 코드다.

nums의 요소가 2의 배수일 경우에만 acc에 push를 한 것인데, acc의 초기값을 배열로 선언해야 가능하다.

주의할 점은 acc에 push를 하고 acc를 꼭 리턴해줘야 한다!

'JavaScript' 카테고리의 다른 글

JS 이벤트, 버블링, 캡처링  (1) 2022.08.31
JS 반복 foreach, for in, for of  (0) 2022.08.12
JS 화살표함수  (0) 2022.08.08
JS 배열 합치기  (0) 2022.08.08
JS 배열 값 추가, 삭제하기  (0) 2022.08.08
Comments