반응형
이번 문제가 여태껏 푼 문제 중에 가장 어려웠다.
내가 직접 풀기보다는 답안지를 보고 분석했다.
Solution
<script>
const endpoint = 'https://gist.githubusercontent.com/Miserlou/c5cd8364bf9b2420bb29/raw/2bf258763cdddd704f8ffd3ea9a3e81d25e2c6f6/cities.json';
const cities = [];
fetch(endpoint)
.then(response => response.json())
.then(data => cities.push(...data)) // api 호출 성공시
.catch(error => console.log(error)); // 실패시
function findMatches(wordToMatch, cities) {
return cities.filter(place => {
const regex = new RegExp(wordToMatch, 'gi'); // g:매칭되는 다수의 결과겂을 기억, i: 대소문자 구분 X
return place.city.match(regex) || place.state.match(regex)
});
}
function numberWithCommas(x) {
// \b : 단어 경계
// \B : 단어 경계가 아님
return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ',');
}
function displayMatches() {
const matchArray = findMatches(this.value, cities);
const html = matchArray.map(place => {
const regex = new RegExp(this.value, 'gi');
const cityName = place.city.replace(regex, `<span class="hl">${this.value}</span>`);
const stateName = place.state.replace(regex, `<span class="hl">${this.value}</span>`);
return `
<li>
<span class="name">${cityName}, ${stateName}</span>
<span class="population">${numberWithCommas(place.population)}</span>
</li>
`;
}).join('');
suggestions.innerHTML = html;
}
const searchInput = document.querySelector('.search');
const suggestions = document.querySelector('.suggestions');
searchInput.addEventListener('change', displayMatches);
searchInput.addEventListener('keyup', displayMatches);
</script>
fetch 함수와 정규식에 대해서 더 공부해볼 것!
반응형
'📍 Front-End > 🜸 JavaScript' 카테고리의 다른 글
[JavaScript30/Day-7] Array Cardio Day 2 (0) | 2021.07.20 |
---|---|
[자바스크립트] .forEach()와 .map()의 차이점 (0) | 2021.07.19 |
[JavaScript30/Day-5] Flex Panel Gallery (0) | 2021.07.18 |
[자바스크립트] forEach, for ... in, for ... of 차이점 (0) | 2021.07.17 |
[JavaScript30/Day-4] Array Cardio Day 1 (0) | 2021.07.17 |
댓글