[JavaScript] take 함수

2023. 5. 2. 07:31· Node.js/JS
목차
  1. Take 함수

Take 함수

const take = (l, iter) => {
  let res = [];
  for (const a of iter) {
    res.push(a);
    if (res.length === l) return res;
  }
  return res;
};

take 함수는 limit과 iterable 객체를 받아서 limit 개수 만큼 값을 저장하는 함수다.

 

그래서 range와 함께 5개의 원소만 뽑아내고자 한다면 다음과 같이 작성할 수 있다.

 

const range = l => {
  let i = -1;
  let res = [];
  while (++i < l) {
	    res.push(i);
    }
    return res;
};

const L = {};
L.range = function *(l) {
	let i = -1;
  while (++i < l) {
    yield i;
  }
};
console.log(take(5, range(100)));

take 함수는 이터러블 프로토콜을 따르고 있고, iterable을 꺼내서 push를 하는 단순한 함수다.

동일하게 L.range도 물론 사용이 가능하다.

console.log(take(5, L.range(100)));

range와 L.range의 차이는 값을 모두 평가한 다음 가져오느냐에 차이가 있다.

예를 들어서 1,000,000개의 원소를 가지는 리스트에서 5개의 원소만 가져온다고 할 때, range의 경우에는 1,000,000개의 원소를 모두 만들어 배열에 값을 평가하여 넣지만, L.range의 경우 5개만 받아서 처리한다는 점에서 효율성 차이가 발생한다.

 

console.time('');
take(5, range(1000000));
console.timeEnd('');

console.time('');
take(5, L.range(1000000));
console.timeEnd('');

: 15.193359375 ms
: 0.057861328125 ms

위와 같이 뚜렷한 차이를 보여준다.

 

또한, 아래의 표현은 무한 수열을 넣어도 되는데, 이는 어차피 5개의 값만 순회를 하기 때문이다. 반면 range의 경우는 불가하다.

이를 사용하는 이유는 배열의 길이가 어느 정도일지 모를 때, 원하는 시점만큼만 순회하고자 할 때 유용하게 사용할 수 있다.


드디어 제너레이터를 통해서 효율적인 코드를 작성하는 부분을 배웠다. 계속 제너레이터를 배우는 이유에 대해서 궁금증이 있었는데, 이렇게 제너레이터를 사용해 이터러블 객체를 반환하도록 하면, 값을 모두 평가하지 않고 next()로 순회하면서 필요할 때 값을 평가하기에 유용한 함수였다. 내가 어느 정도 길이의 배열을 사용하지 모르겠을 때, 조금 더 성능이 좋게 사용할 수 있다는 점에서 좋은 방법이라고 생각이 든다.

 

ㅊ출처: 인프런 함수형 프로그래밍과 JavaScript ES6+

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

'Node.js > JS' 카테고리의 다른 글

[JavaScript] reduce, map, filter, take 중첩 사용  (0) 2023.05.03
[JavaScript] 제너레이터/이터레이터 프로토콜로 구현하는 지연 평가  (0) 2023.05.02
[JavaScript] range와 느긋한 L.range 테스트  (0) 2023.05.01
[JavaScript] range와 느긋한 L.range  (0) 2023.04.30
[JavaScript] 이터러블 객체와 순회 함수 응용  (0) 2023.04.30
  1. Take 함수
'Node.js/JS' 카테고리의 다른 글
  • [JavaScript] reduce, map, filter, take 중첩 사용
  • [JavaScript] 제너레이터/이터레이터 프로토콜로 구현하는 지연 평가
  • [JavaScript] range와 느긋한 L.range 테스트
  • [JavaScript] range와 느긋한 L.range
턴태
턴태
import { Dream } from "future";
턴태
턴태의 밑바닥부터 시작하는 de-vlog
턴태
전체
오늘
어제
  • ROOT (187)
    • Node.js (37)
      • ES6 (1)
      • TypeScript (3)
      • Express.js (16)
      • NestJS (16)
      • JS (24)
    • 프론트엔드 (29)
      • CS (5)
    • 백엔드 (1)
      • 검색 (2)
      • Database (1)
    • 기타 툴 (1)
      • git (1)
    • 데브옵스 & 인프라 (19)
      • Kubernetes (15)
      • Docker (2)
      • Monitoring (1)
      • IaC (1)
    • Algorithm (90)
      • Implementation & simulation (5)
      • Math (4)
      • Brute Force (1)
      • String (0)
      • Graph (5)
      • Recursion & Backtracking (19)
      • Divide & Conquer (2)
      • Dynamic Programming (18)
      • Greedy (13)
      • Priority Queue (2)
      • Binary Search (6)
      • Data Structure (7)
      • Shortest Path (5)
      • Minimum Spanning Tree (1)
      • Sorting (1)
      • Prefix Sum (1)
    • Linux (1)
      • Ubuntu (1)
    • Diary (5)
      • Algorithm (1)
      • Conference (1)
      • Retrospective (3)
    • Book (0)
      • Self-Development (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 오먹
  • k8s
  • 토이프로젝트
  • Express
  • 파이썬
  • 쿠버네티스
  • 다이나믹 프로그래밍
  • nestjs
  • 인프런
  • 인프런X디프만
  • baekjoon
  • node.js
  • GREEDY
  • Omuk
  • 네스트
  • 자바스크립트
  • 백트래킹
  • 노드
  • 디프만
  • 함수형 프로그래밍
  • N과 M
  • dynamic programming
  • TypeScript
  • backtracking
  • 익스프레스
  • python
  • 백준
  • Kubernetes
  • 타입스크립트
  • Toy Project

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.1
턴태
[JavaScript] take 함수
상단으로

티스토리툴바

단축키

내 블로그

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

블로그 게시글

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

모든 영역

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

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