wordFinder("this is the MOMENT, THIS IS THE day")를 입력받은 경우, 다음과 같이 결과를 리턴해야 한다.
{ this : 2,
is : 2,
the : 2,
moment : 1,
day : 1
}
function wordFinder(str) {
let result = {};
let reg = /[\{\}\[\]\/?.,;:|\)*~`!^\-_+<>@\#$%&\\\=\(\'\"]/gi;
str = str.replace(reg,'');
if (str === "") {
return result;
} else {
str = str.toLowerCase();
str = str.split(" ");
result = str.reduce((acc, cur) => {
acc[cur] = (acc[cur] || 0) + 1; // 객체에서 cur(key값)을 찾아 value값이 있으면 그 value에서 1을 더하고, 없다면 0을 할당하고 거기에 1을 더해준다.
return acc;
}, {}); // initialValue를 빈객체 {}로 설정
}
return result;
}
단어가 존재하지 않는 경우, 빈 객체를 리턴해야 하므로 result에 빈객체를 생성하여 조건문에 적용해 주었다.
문자열에 기호가 들어가 있어서 기호를 제거해주는 정규표현식을 이용하여 replace로 대체해 주었다.
대소문자를 구분하면 같은 단어라도 서로 같지 않다고 나오기 때문에, toLowerCase로 문자열을 모두 소문자로 바꾸어 주었다.
공백을 기준으로 문자열을 split해 주면 각 단어가 배열에 담기게 된다.
reduce메서드
를 사용해준다.
initialValue를 {}로 지정해주었기 때문에 acc(누적값)의 첫 값은 {}이다. 그리고 배열의 첫 값을 받는 cur은 ‘this’이고, 빈 객체에서 ‘this’를 찾는 acc[cur]값은 undefined가 나온다. 아직 빈 객체라 ‘this’ key값의 value가 없기 때문이다.
객체안에 ‘this’의 값이 없었기 때문에 0을 할당한 뒤 + 1해주었고, 두번째 cur값은 ‘is’다. 이번에도 역시 객체안에 ‘is’라는 key값은 존재하지 않기 때문에 acc[cur]값은 undefined다.
‘is’의 value값으로 0+1이 할당되었기 때문에, 누적값은 {this: 1, is:1}이 되었다. 이후 부터는 객체안에 key값이 존재하면 그 value값에 1을 더해주고, 없다면 0을 할당한뒤 1을 더해주는 방식을 반복한다.