• reduce 활용하기

    2022. 11. 17.

    by. JJo 😊

    const values = ['banana', 'apple', 'orange', 'orange', 'apple'];
    const count = values.reduce((acc, cur) => {
    	acc[cur] = (acc[cur] || 0) + 1
    	return acc;
    }, {})

    배열의 reduce() 메서드는 배열의 각 요소에 대해 주어진 리듀서(reducer) 함수를 실행하고, 하나의 결과값을 반환한다. 

    리듀서 함수는 네 개의 인자를 가진다.

    1. 누산기 (acc)
    2. 현재 값 (cur)
    3. 현재 인덱스 (idx)
    4. 원본 배열 (src)

    리듀서 함수의 반환 값은 누산기에 할당되고, 누산기는 순회 중 유지되므로 결국 최종 결과는 하나의 값이 된다.

    구문

    arr.reduce(callback[, initialValue])
    const values = [1,2,3,4,5,6];
    let result = values.reduce((acc, cur) => acc + cur, 0)
    console.log(result); //21

    reduce 활용

    👉 평균 구하기

    const values = [1,2,3,4,5,6];
    const average = values.reduce((acc, cur, i, {length}) => {
    	return i === length - 1 ? (acc + cur) / length : acc + cur
    }, 0)
    
    console.log(average)  //3.5

    현재 순회 중인 요소가 마지막 요소(i === length - 1)이면 평균을 구하고, 그렇지 않으면 계속 누적되게 하여 배열 요소의 평균값을 구할 수 있다.

     

    👉 최대값 구하기

    const values = [1,2,3,4,5];
    const max = values.reduce((acc, cur) => acc > cur ? acc : cur, 0);
    console.log(max) //5

    누적값과 현재 순회 중인 요소와 비교하여 큰 값을 할당시켜 배열 내에서 최대값을 구할 수 있다.

    (최대값을 구할 때에는 reduce()보다는 Math.max를 사용하는 것이 더 직관적이다.)

     

    👉 요소의 중복 횟수 구하기

    const values = ['banana', 'apple', 'orange', 'orange', 'apple'];
    const count = values.reduce((acc, cur) => {
    	acc[cur] = (acc[cur] || 0) + 1
    	return acc;
    }, {})
    
    conosole.log(count) //{banana : 1, apple: 2, orange: 2}

    첫 번째 순회 시 acc에는 초기값으로 {}를 할당하고, cur에는 'banana'가 할당된다. 초기값으로 전달받은 {}에 요소값인 cur을 프로퍼티 키로, 요소의 개수를 프로퍼티 값으로 할당한다. 만약, 프로퍼티 값이 undefined(처음 등장하는 요소)이면 프로퍼티 값을 1로 설정한다.

     

    👉 중복 요소 제거 하기

    const values = [1, 2, 1, 3, 5, 4, 5, 3, 4, 4];
    const result = values.reduce((acc, cur, i, arr) => arr.indexOf(cur) === i ? [...acc, cur] : acc, []);
    
    console.log(result) //[1,2,3,5,4]

    indexOf()가 배열에서 지정된 요소를 찾을 수 있는 첫 번째 인덱스를 반환하는 것을 이용하여, 배열 내 중복되는 요소를 제거할 수 있다. 

     

    728x90

    'Javascript' 카테고리의 다른 글

    jQuery 문법을 javascript로 쉽게 바꾸는 사이트  (0) 2023.05.22
    공공(오픈)데이터 API  (0) 2023.04.02
    this  (2) 2022.09.10
    데이터 불변성  (0) 2022.09.10
    JS 프로처럼 쓰는 팁  (0) 2022.09.05

    댓글