cheetsheet

length 프로퍼티 없이 이터레이터로 Each 구현하기

2023. 3. 17. 13:43
목차
  1. 🐕 과제를 하다가...
  2. 👻어케 함

🐕 과제를 하다가...

underbar라는 과제가 있는데 배열 내장 메서드 없이

배열 내장 메서드를 구현하는 내용이었습니다.

근데 전 length 프로퍼티도 사용하면 안되는 줄 알고

이걸 length 없이 어떻게 구현할까 고민하다가

결국 이터러블 프로토콜을 이용해서 직접 만들면되지않나? 라는 결론에 도달했어요


👻어케 함

다행히도 정적메서드는 사용해도 오류가 안 나길래 썼는데..

(생각해보면 정적메서드도 되는데 length를 막아놨다고 생각하는 거 자체가 이상하긴함)

그러면 맨 처음 생각나는 선택지는

while문을 만들어서 무한정으로 값을 올려주는

let idx = 0

while(arr[idx] !== undefined) {
  idx++
}

이런 선택지를 고려할 수 있을 것입니다.

하지만 이 방식에는 치명적인 문제점이 있어요

흔치는 않겠지만 배열의 요소에 의도적으로 undefined가 할당되어있는 경우

굉장히 이상하게 동작할텐데 그걸 예외처리해줄 방법도 딱히 없으니까요!!

결국 가장 확실한건 이터레이터와 넥스트메서드를 사용하는거라고 생각했습니다.

_.each = function (collection, iteratee) {
  if (Array.isArray(collection)) {
    let idx = 0;
    let areYouDone = collection[Symbol.iterator]();
    let doneBoolean = false;
    while (!doneBoolean) {
      const iResult = areYouDone.next();
      doneBoolean = iResult.done;
      if (doneBoolean) return;
      let iValue = iResult.value;
      iteratee(iValue, idx, collection);
      idx++;
    }
  } else {
    for (let key in collection) {
      iteratee(collection[key], key, collection);
    }
  }
  // TODO: 여기에 코드를 작성합니다.
};

따라서 이렇게 구현을 했는데 사실 처음부터 이런 구조였던게아닙니다.

첫번째 주의 사항

done 프로퍼티의 값을 받아오려면 next() 메서드를 호출해야하고

next()메서드는 어디서 호출되었든 호출되는 순간

다음 요소로 전진해버리기 때문에

한 반복에서 딱 한번만 next()메서드를 사용하고

그 값을 변수에 저장한 뒤 적절하게 사용해줄 필요가 있습니다.

 

따라서 iResult변수에 next() 메서드의 호출 결과(이터레이터 리절트 객체)를 담아준 뒤

그 값들을 활용해서 while문의 종료조건으로도 사용하고..

콜백의 인자로도 사용하고... 다 해주면 됩니다.

 

두번째 주의사항

done 프로퍼티의 밸류가 true로 바뀌는 시점은

마지막 요소를 만난 다음 next() 메서드입니다.

let arr = [1, 2, 3, 4, 5];

let a = arr[Symbol.iterator]();
console.log(a.next());
console.log(a.next());
console.log(a.next());
console.log(a.next());
console.log(a.next());
console.log(a.next());

따라서 위 코드의 출력결과를 생각해보면 쉽습니다.

{ value: 1, done: false }
{ value: 2, done: false }
{ value: 3, done: false }
{ value: 4, done: false }
{ value: 5, done: false }
{ value: undefined, done: true }

배열의 길이는 5인데 next메서드는 총 6번을 호출해야

done이 true로 바뀝니다.

그럼 마지막 호출일땐 코드를 실행하지않고 끝내줘야 정상적으로 동작할거란 예상이 가능하죵

    let idx = 0;
    let areYouDone = collection[Symbol.iterator]();
    let doneBoolean = false;
    while (!doneBoolean) {
      const iResult = areYouDone.next();
      doneBoolean = iResult.done;
      if (doneBoolean) return;
      let iValue = iResult.value;
      iteratee(iValue, idx, collection);
      idx++;
    }

따라서 이렇게 코드를 작성하면

아주 멋진 나만의 forEach문이 완성되지만

원본 forEach문이 더 좋으니까 쓸모는 없겠네요 감사합니다.


이해했다고 생각할 때가 가장 무서울 때다.

 

반응형
저작자표시 비영리 (새창열림)

'cheetsheet' 카테고리의 다른 글

자바스크립트로 구현하는 디바운싱 예제(trailing edge)  (0) 2023.04.22
node-sass 설치 에러 해결 방법과 원인..  (0) 2023.04.16
콜백으로 준식 지옥을 만들어보자  (8) 2023.03.16
reset.css 인풋,버튼 태그의 배경 바꾸기와 placeholder 글자 색 바꾸기  (0) 2023.03.04
도커를 사용해보자 아주 멋지게..Docker....  (0) 2023.02.24
  1. 🐕 과제를 하다가...
  2. 👻어케 함
'cheetsheet' 카테고리의 다른 글
  • 자바스크립트로 구현하는 디바운싱 예제(trailing edge)
  • node-sass 설치 에러 해결 방법과 원인..
  • 콜백으로 준식 지옥을 만들어보자
  • reset.css 인풋,버튼 태그의 배경 바꾸기와 placeholder 글자 색 바꾸기
냠냠맨
냠냠맨
프론트엔드 개발 전반을 다루는 기술 블로그입니다.
냠냠맨
React와 TypeScript를 좋아하는 개발자
냠냠맨
전체
오늘
어제
  • all category (434) N
    • CMC (0)
    • best (11)
    • 년간회고 (1)
    • cheetsheet (15)
    • 프로젝트 회고 (3)
    • 서평 (3)
    • SEO Study (1)
    • 프로젝트 진행기 (10)
    • testcode (9)
    • yarnberry (7)
    • css (21)
    • typescript (15)
    • redux (7)
    • react (43)
    • Next.js (9)
    • Nestjs (3)
    • javascript (44)
    • programmers (67)
    • leetcode (41)
    • frontend (41)
    • backjoon (1)
    • Next.js Beta Docs 번역 (12)
    • TIL (15)
      • html (3)
    • Network (12)
      • 간단 정리 시리즈 (2)
      • 질답 준비 (0)
    • 자료구조와 알고리즘 (2)
    • CS (4)
      • OS (1)
    • 취업준비 (2)
    • zoom websocket (2)
    • talk (6)
    • 면접대비 (1)
    • 코드스테이츠 프론트 (5)
    • 간헐적 회고 (18) N

블로그 메뉴

  • leetcode
  • programmers
  • javascript
  • html
  • css

공지사항

인기 글

태그

  • 테오의스프린트17기
  • 코드스테이츠 #프론트엔드
  • LeetCode
  • 개발
  • teosprint
  • 주니어개발자
  • 테오의스프린트
  • 프론트엔드
  • frontend
  • 개발자
  • JavaScript
  • border말풍선
  • 말풍선
  • CSS

최근 댓글

최근 글

hELLO · Designed By 정상우.
냠냠맨
length 프로퍼티 없이 이터레이터로 Each 구현하기
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.