\(@^0^@)/

[TDL] 04/29 Today's-Done-List 본문

TDL

[TDL] 04/29 Today's-Done-List

minjuuu 2022. 4. 29. 22:56
728x90

- JS 기본 문법

  • 객체를 배열로 리턴하는 메서드들
    • Object.keys() : keys의 배열을 제공하는 것과 동일한 순서로 반환.
const object1 = {
  a: 'somestring',
  b: 42,
  c: false
};

console.log(Object.keys(object1));
// expected output: Array ["a", "b", "c"]
  • Object.values() : values의 배열을 제공하는 것과 동일한 순서로 반환.
const object1 = {
  a: 'somestring',
  b: 42,
  c: false
};

console.log(Object.values(object1));
// expected output: Array ["somestring", 42, false]
  • Object.entries() : keys와 values를 배열 안에 배열을 품고 있는 2차원 중첩 배열 형태로 반환.
const obj = { foo: 'bar', baz: 42 };
console.log(Object.entries(obj)); // [ ['foo', 'bar'], ['baz', 42] ]

// array like object
const obj = { 0: 'a', 1: 'b', 2: 'c' };
console.log(Object.entries(obj)); // [ ['0', 'a'], ['1', 'b'], ['2', 'c'] ]

// array like object with random key ordering
const anObj = { 100: 'a', 2: 'b', 7: 'c' };
console.log(Object.entries(anObj)); // [ ['2', 'b'], ['7', 'c'], ['100', 'a'] ]
const object1 = {
  a: 'somestring',
  b: 42
};

for (const [key, value] of Object.entries(object1)) {
  console.log(`${key}: ${value}`);
}

// expected output:
// "a: somestring"
// "b: 42"

 

const items = ['réservé', 'premier', 'communiqué', 'café', 'adieu', 'éclair'];
const korean = ['안', '녕', '하', '세', '요'];

items.sort(function (a, b) {
  return a.localeCompare(b);              // ['adieu', 'café', 'communiqué', 'éclair', 'premier', 'réservé']
});

korean.sort(function (a, b) {
  return a.localeCompare(a);              // ['안', '녕', '하', '세', '요']
});

korean.sort(function (a, b) {
  return a.localeCompare(b);              // ['녕', '세', '안', '요', '하']
});


- 
JavaScript youtube

  • youtube 검색 기능
    • keyup, click event를 호출되는 search함수 생성
    • 검색(input) 창에 적히는 모든 문자열을 소문자로 변환.
    • 반복문을 돌면서 모든 list의 타이틀을 가져온다.
    • indexOf() 배열 메서드를 조건문에 사용하여, 만약 검색한 결괏값이 해당 list안에 존재하면
      list안의 해당 타이틀(index)만 'flex'로 변경해주고 그렇지 않으면 none을 적용해준다.
      (indexOf()에서 output이 -1일 경우에는 false로 결괏값이 없다는 표시. 즉, -1 보다 커야 결괏값을 받을 수 있다.)
      https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf
    • indexOf() 뿐 아니라, includes()등 다양한 메서드들을 적용할 수 있다.

const $search = get('#search')
const $list = getAll('.contents.list figure')
const $searchButton = get('.btn_search')

const search = () => {
    let searchText = $search.value.toLowerCase()
    for (let index = 0; index < $list.length; index++) {
      const $target = $list[index].querySelector('strong')
      const text = $target.textContent.toLowerCase()
      if (-1 < text.indexOf(searchText)) {
        $list[index].style.display = 'flex'
      } else {
        $list[index].style.display = 'none'
      }
    }
 }
 
const init = () => {
$search.addEventListener('keyup', search)
$searchButton.addEventListener('click', search)
}

 

  • picture태그 안 source의 srcset 요소 속성 값 재설정
    • picture태그 안의 picture에 mouseover, mouseout event를 걸고
    • 그 이벤트 함수에서 source를 셀렉하여 해당 요소의 속성 값을 설정한다.
    • mouseOver를 하면 확장자 webp를 가진 움직이는 짤로 설정하고
      mouseOut를 하면 확장자 jpg를 가진 그냥 사진으로 설정.
    • webp란?

const onMouseOver = (e) => {
    const webplay = e.target.parentNode.querySelector('source')
    webplay.setAttribute('srcset', './assets/sample.webp')
  }

  const onMouseout = (e) => {
    const webplay = e.target.parentNode.querySelector('source')
    webplay.setAttribute('srcset', './assets/sample.jpg')
  }

  const init = () => {
    for (let index = 0; index < $list.length; index++) {
      const $target = $list[index].querySelector('picture')
      $target.addEventListener('mouseover', onMouseOver)
      $target.addEventListener('mouseout', onMouseout)
    }
  }
  init()

 

  • hash값을 사용하여 DOM 이벤트 동작
    https://developer.mozilla.org/ko/docs/Web/API/URL/hash
    • init함수에 list의 각 요소를 반복문을 돌려서 click event가 작동되면 hashChange함수가 호출된다.
    • list의 타이틀을 뽑아서, window.location.hash에 view& 와 함께 할당해주고,
      getViewPage로 페이지를 전환시킨다.
    • getViewPage에 내가 url에 hash값으로 넘겨준 list의 타이틀을 decode 해서 view& 뒤로 split 해줘서
      제대로 된 list의 타이틀을 viewPage에 넣어준다.
    • 현재 url에 view가 붙어있다면 : 상세페이지
      현재 url에 view가 붙어있지 않다면 : 메인 페이지
    • 각 페이지에 console.log(window.location.hash)를 할 경우 메인 페이지 : undefined
      상세페이지 : 각 list 타이틀의 hash값  ex) #view&Lorem%20Ipsum%20Powerful%20movie
    • 따라서 조건문을 생성하여 만약에 indexOf()로 hash안에 view를 찾으면, 상세페이지
      찾지 못하면, 메인 페이지로 보낸다.
const hashChange = (e) => {
    e.preventDefault()
    const parentNode = e.target.closest('figure')
    const viewTitle = parentNode.querySelector('strong').textContent
    window.location.hash = `view&${viewTitle}`
    getViewPage()
  }

  const getViewPage = () => {
    const viewTitle = get('.view strong')
    const urlTItle = decodeURI(window.location.hash.split('&')[1])
    viewTitle.innerText = urlTItle

    get('.list').style.display = 'none'
    get('.view').style.display = 'flex'
  }

  const getListPage = () => {
    get('.view').style.display = 'none'
    get('.list').style.display = 'flex'
  }
  
  const init = () => {
    for (let index = 0; index < $list.length; index++) {
      $list[index].addEventListener('click', hashChange)
    }
    window.addEventListener('hashchange', () => {
      const isView = -1 < window.location.hash.indexOf('view')
      if (isView) {
        getViewPage()
      } else {
        getListPage()
      }
    })
  }
  init()



17:50 오후 회고 스터디 (만족도 : 6)

계획보다 많이 못했음.



- 자료구조 / 알고리즘 (Js ver.) 강의

최근 배열 관련 알고리즘을 풀고 있는데 초반에 반복문, 조건문만 풀 때와 당연히 다른 수준이라고는 생각했지만,
생각보다 너무 어려워서 점점 풀기가 싫어지는 요즘이다... 근데 아직 초보단계 문제라는 게 함정
그래도 하루에 한 문제라도 꾸준히 풀다 보면, 언젠가는 내손으로 완벽히 푸는 날이 오지 않을까 싶다~



22:50 저녁 회고 스터디 (만족도 : 6)

오후보단 집중이 잘 됐지만, 그래도 집중도가 안 좋다... 큰일이다 큰일
5월부터는 진짜 진짜 마음을 다 잡고서 목표한 것은 최대한 달성해보자!


[ 출처, 참고 : 제로베이스 프런트엔드 스쿨 ]

728x90

'TDL' 카테고리의 다른 글

[TDL] 05/02 Today's-Done-List  (0) 2022.05.02
[TDL] 05/01 Today's-Done-List  (0) 2022.05.02
[TDL] 04/28 Today's-Done-List  (0) 2022.04.29
[TDL] 04/26 Today's-Done-List  (0) 2022.04.26
[TDL] 04/25 Today's-Done-List  (0) 2022.04.25