[JS]아랍어 단어장 페이지 만들기-2.단어 Data 출력하기

CHO WanGi·2023년 5월 13일

Javascript

목록 보기
4/20

계획

단어 데이터는 Home(메인)에는 모든 품사를,
Noun 에는 명사만을 출력할 예정이다

1. 전체 단어 데이터 출력하기

단어 데이터를 받아와서 출력하는 기능을 담당할 WordList 컴포넌트를 제작했다.

헤헤 역시 뭔가 만들어봐야 한다

import { CoreCompoent } from "../core/coreComponent";
import { DATA } from "../worddata";

export default class WordList extends CoreCompoent {
  render() {
    const data = DATA
    this.el.innerHTML = /* html */`
      <div class="word">
        <ul>
        ${data.map( function (element) {
            return `<li>${element.single} : ${element.mean}</li>`
            }).join('')}
        </ul>
      </div>
    `
  }
}

1. Map 함수

callback 함수를 실행한 결과를 가지고 새로운 배열을 만들때 사용

🚨 Foreach 를 사용하지 않고 map 함수를 사용한 이유

사실은 foreach를 먼저 썼다가 아무것도 안나와서 map을 써봤는데 작동했다....^^

그래도 왜? 를 알아봐야하기에...

그 답은 둘의 차이점에 있다.
foreach와 map 메서드 둘다 배열의 모든 요소를 순회하면서,
인수로 전달받은 callback 을 반복 호출하는 것은 동일하지만,

차이점map 메서드는 콜백 함수의 반환값들로 구성된 새로운 배열을 반환한다.
foreach는 새로운 배열을 반환하지 않는다

이말인 즉슨 내가 출력할 값을 리턴을 받아서 그 리턴값을 this.el 안으로 집어 넣어야 하는데
foreach 는 콜백 함수를 호출만 할뿐, 리턴값을 주지 않는다.

If 만약 foreach를 쓴다면...?

이렇게 반환값이 undefined로 나타난다

그리고 join("") 메소드를 사용하여 배열 요소의 구분이 콤마(,)로 되어있던걸, 없애서 콤마랑 같이 출력되지 않도록 했다.

2.명사 & 동사 데이터만 출력하기

전체 데이터 출력 방식에서 filter() 메소드만 추가했다.

import { CoreCompoent } from "../core/coreComponent";
import { DATA } from "../worddata";


export default class Noun extends CoreCompoent {
  render(){
    const data = DATA
    this.el.innerHTML = /* html */`
      <h1> Noun Page</h1>
      <div class="word">
        <ul>
        ${data
        .filter(data => data.part === "noun")
        .map(function (element) {
            return `<li>${element.single} : ${element.mean}</li>`
            }).join('')}
        </ul>
      </div>
    `
  }
}

원리는 이렇다
1. 단어데이터를 filter() 메소드를 통해 먼저 거른다
2. 걸러진 데이터를 map 함수를 통해 반복 호출하여 리턴값을 출력한다.

참고

Link: [JavaScript] map, filter (ft.같이 사용하기)

중간 구현 결과

  1. 메인 페이지

  2. 명사 페이지

  3. 동사 페이지

남은 것들

  1. Header 컴포넌트 고도화 필요
    -> 현재 접속한 페이지가 어딘지를 표시할 필요성을 느낌
  2. SearchBar 컴포넌트 필요
  3. Store 기능 활용 필요(-> 이래야 나중에 API로 받아온 데이터를 관리하기 편함)
profile
제 Velog에 오신 모든 분들이 작더라도 인사이트를 얻어가셨으면 좋겠습니다 :)

0개의 댓글