const arr = [1, 2, 3, 4, 5]
const newArr = arr.reduce( (accumulator, currentValue, index, array) => {
return accumulator + currentValue
})
console.log(newArr) // 출력 15
accumulator (누산기) 에 초기값을 설정 안 해주면 배열 첫번째 요소가 초기값으로 설정됨, 현재 배열 1
currentValue 현재 배열 2
index는 배열의 위치
ex) arr[0] === 1, index는 0
array는 배열 전체 [1, 2, 3, 4, 5]
const arr = [1, 2, 3, 4, 5]
// 1.
arr.reduce( (accumulator, currentValue, index, array) => {
return accumulator + currentValue
}, {}) // 초기값 설정 위치
// 2.
arr.reduce( (acc, cv) => acc + cv, 3)
초기값을 빈 객체 { } 로 지정해주면, accumulator(누산기) 초기값은 { }
초기값을 3으로 지정하면 accumlator의 초기값은 3으로 시작
const solution = (array) => {
// 1. reduce
const newObject = array.reduce((acc, cv) => {
if(acc[cv]) {
acc[cv] = acc[cv] + 1
} else if(!acc[cv]) {
acc[cv] = 1
}
return acc
}, {})
const maxValue = Math.max(...Object.values(newObject))
const newEntries = Object.entries(newObject)
// 2. map
const newArray = newEntries.map(([key, value]) => {
if(value === maxValue) {
return key
}
})
// 3. filter
const clearArray = newArray.filter(Boolean)
return clearArray.length > 1 ? -1 : Number(clearArray[0])
}
첫 번째 입력 [1, 2, 3, 3, 3, 4]
reduce
currentValue가 없을 시 1을 대입, 출력 '1' : 1
currentValue가 없을 시 1을 대입, 출력 '2' : 1
currentValue가 없을 시 1을 대입, 출력 '3' : 1
currentValue가 있을 시 + 1 카운팅, 출력 '3' : 2
currentValue가 있을 시 + 1 카운팅, 출력 '3' : 3
currentValue가 없을 시 1을 대입, 출력 '4' : 1
출력 : { '1' : 1, '2' : 1, '3' : 3, '4' : 1 }
Math.max() 함수 안에는 순수한 값만 들어가야 함
ex) Math.max(1, 2, 3)
...연산자를 사용해 객체에 속한 값만 추출
maxValue = 3
Object.entries 메소드를 통해 [key, value] 쌍을 담은 배열을 반환
newEntries = [['1' : 1], ['2' : 1], ['3' : 3], ['4' : 1]]
map
map 메소드를 통해 key, value 쌍을 담은 배열을 묶어서 가공
maxValue와 value가 같은 key를 리턴
[undefined, undefined, 3, undefined] 으로 출력 됨
filter
undefined 등의 Boolean 타입을 필터링
'3' (문자열) 을 반환
clearArray.length가 1보다 작으므로 Number(clearArray[0])
3 (숫자) 출력