javscript를 사용하고 또 리액트를 사용하면서, 평소에도 중요하다 생각했지만 실제로 프로젝트를 진행해보니까 다시한번 중요하다 생각이든 메소드에 대해 정리를 해보려고 한다.
오늘은 그 중에 reduce에 대해 정리해보려고 한다.
먼저 reduce를 정리하며 알아낸 정보들은 다음 아래와 같다.
- reduce는 Array 객체 ProtoType에 정의되어 있는 고차 함수이다.
reduce
는 배열의 값을 한개로 감소 시키는 특징을 가지고 있다.map
,filter
,find
함수로 구현할 수 있는 기능들은 모두reduce
함수로 구현 가능하다.- 두번째 매개변수인
initialValue
를 통해 반환 값을 자유롭게 지정하여 유연하게 사용 가능하다.
즉 정리하자면, reduce는 배열의 각 요소에 대해 callback을 실행하며 단 1개의 출력 결과를 만든다.
배열 원소를 입력으로하여 1개의 수치 또는 문자열,배열,객체를 만든다. 그래서 "줄이다"의 의미인 reduce라는 이름을 얻었다.
reduce는 다재다능하다.
배열 원소들의 전체 합을 구하거나 최대값을 구할 수 있고, 배열을 펼치거나 원소들의 개수를 셀 수 있다.
이 메소드의 문법은 아래와 같다.
array.reduce(callback(accumulator, currentValue[, index[, array]] )[, initialValue])
const num =[1,2,3,4,5]
const total=num.reduce((acc,cur)=> acc+cur,0)
console.log(total)// 15
const obj =[{quntity: 1},{quntity: 2},{quntity: 3}]
const total =obj.reduce((acc,cur)=> acc+cur.quntity,0)
console.log(total) // 6
const order =[
{price:1000,amount:4},
{price:2000,amount:3},
{price:3000,amount:2},
{price:4000,amount:1},
]
const total = order.reduce((acc,cur)=> acc+(cur.price)*(cur.amount),0)
console.log(total)//20000
배열안에 배열이 있는 경우 순회하면서 concat으로 붙여서 펼쳐진 배열을 구할수 있다.
const flattened = [[0,1],[2,3],[4,5]]
const result = flattened.reduce((acc,cur)=> acc.concat(cur),[])
console.log(result)//[0,1,2,3,4,5]
초기값은 빈 객체({})로 지정하고 return 결과가 다시 입력으로 사용될 수 있도록 한다.
const names =['sewon','yejin']
const result=names.reduce((acc,cur)=>{
acc[cur]=cur
return acc
},
{})
console.log(result) //{ sewon: 'sewon', yejin: 'yejin' }
const countedNames =['A','B','B','B','A','C']
const result = countedNames.reduce((acc,cur)=>{
if(cur in acc){
acc[cur]++
} else{
acc[cur]=1
}
return acc
},{})
console.log(result)// {A: 3, B: 2, C:1}
const names = ['Alice', 'Bob', 'Tiff', 'Bruce', 'Alice']
const result = names.reduce((acc,cur)=>{
if(cur in acc){
acc[cur]++
}else{
acc[cur]=1
}
return acc
},{})
console.log(result)// { 'Alice': 2, 'Bob': 1, 'Tiff': 1, 'Bruce': 1 }
이름,나이,주소가 저장된 객체 값이 비어있는 경우 해당 엘리먼트를 필터링한다.
const params={name:'sewon', age:'', address:"seoul"}
const filteredParams = Object.keys(params).reduce((filter,key)=>{
console.log(params[key]) //'sewon','','seoul'
if(params[key] !==''){
filter[key] = params[key]
} return filter
},{})
console.log(filteredParams) //{ name: 'sewon', address: 'seoul' }
또는 Object.entries, filter, reduce 사용하는 방법
(Object.entries( )는 for...in와 같은 순서로 [key, value] 쌍의 배열을 반환한다.)
const params={name:'sewon', age:'', address:"seoul"}
const filteredParams=Object.entries(params).filter(([key,value]) => value !=='').reduce((result,[key,value])=>({...result,[key]:value}),{})
console.log(filteredParams) //{ name: 'sewon', address: 'seoul' }
const people = [
{ name: 'Alice', age: 21 },
{ name: 'Bob', age: 33 },
{ name: 'Jane', age: 26 },
{ name: 'Steve', age: 33 },
{ name: 'Joseph', age: 80 }
];
function groupBy(objectArray, property) {
return objectArray.reduce(function (acc, obj) {
const key = obj[property];
if (!acc[key]) {
acc[key] = [];
}
acc[key].push(obj);
return acc;
}, {});
}
const groupedPeople = groupBy(people, 'age');
// groupedPeople is:
// {
// 21: [
// { name: 'Alice', age: 21 },
// ],
// 33: [{ name: 'Bob', age: 33 },
// { name: 'Steve', age: 33 },
// ]
// ...
// }
배열 내 객체는 이름과 나이 속성을 갖는다. 특정 속성으로 그룹 짓고자 할 때 쓰는 함수를 만드는 문제에서 reduce 메소드를 썼다. 역시 초기값으로 빈 객체를 할당해준 뒤 key 유무에 따라 배열 내 요소(객체)를 최신 결과값 객체에 추가한다.
const people = [
{ name: 'Alice', age: 21 },
{ name: 'Bob', age: 33 },
{ name: 'Jane', age: 26 },
{ name: 'Steve', age: 33 },
{ name: 'Joseph', age: 80 }
];
const groupedPeople = people.reduce((acc,property)=>{
const key = property.age // 21,33,26,33,80
if(!acc[key]){
acc[key]=[]
} acc[key].push(property)
return acc
},{})
console.log(groupedPeople)
//{
// '21': [ { name: 'Alice', age: 21 } ],
// '26': [ { name: 'Jane', age: 26 } ],
// '33': [ { name: 'Bob', age: 33 }, { name: 'Steve', age: 33 } ],
// '80': [ { name: 'Joseph', age: 80 } ]
//}