문제
Write a getCharCount prototype function for arrays of strings that returns an object of character counts.
(어레이 내 모든 문자열의 문자 하나하나를 카운트해서 오브젝트로 출력하는 getCharCount 함수를 만들어라.)
const result = ['Charmander', 'Charmeleon', 'Charizard'].getCharCount()
/*
* Returns
{
C: 3,
h: 3,
a: 5,
r: 5,
m: 2,
n: 2,
d: 2,
e: 3,
l: 1,
o: 1,
i: 1,
z: 1
}
*/
문제 해석
- 모든 것을 순회해서 다른 자료를 만든다. → reduce 메서드를 쓰기 적합한 환경이다.
- 배열의 메서드로 활용되고 있다. → 배열 어레이로써 만든다. Array.prototype.getCharCount() = function(){}
- reduce로 배열을 순회할 수 있다. 그럼 배열 내 문자열의 각 문자는 어떻게 순회할 것인가? → 내부 함수(기능적 동일)
문제 접근 순서
- 함수의 외형을 만든다. Array.prototype.getCharCount = function() {}
- 먼저 어레이를 순회할 reduce를 대충 구상한다. (코드 내 1번 주석)
- 어레이의 엘리먼트를 reduce로 받을 수 있다.
그렇다면 엘리먼트를 순회해서 글자를 카운트하는 기능을 함수로 제작해서 합친다. (코드 내 2번 주석)
문제 풀이
Array.prototype.getCharCount = function () {
const parse = (map = {}, str, i = 0) => {
if (str.length <= i) return map
map[str[i]] = (map[str[i]] || 0) + 1
return parse(map, str, i + 1)
} // (2)
return this.reduce((acc, e) => {
return parse(acc, e)
}, {}) // (1)
}
You might have seen an array and noticed an opportunity to use reduce. Great! Another simple way to solve this problem would have been to use two levels of recursion, like in zeroSquare—for example an i counter for the strings and a j counter for the letters. You also probably noticed that whether you used recursion or reduce, you would need an accumulator, starting as an empty object {}, to store the results.
'Javascript' 카테고리의 다른 글
의도적으로 콜백지옥 만들기 (0) | 2022.10.19 |
---|---|
this에 관하여 (2) | 2022.10.15 |
new 키워드 (0) | 2022.10.12 |
(문제) 오브젝트 내 가장 긴 문자열 value를 가진 key를 출력하기 (0) | 2022.10.05 |
(문제) 오브젝트 내 value 중 가장 긴 문자열을 출력하기 (0) | 2022.10.05 |