Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 러닝리액트
- range 함수 직접 만들기
- 리액트 고차컴포넌트
- 프로미스 직접 구현하기
- 프로미스
- react 배열 재정렬하기
- debound
- 리액트 dragdrap
- 리엑트 검색 기능 구현하기
- 자바스크립트 reduce 함수 직접 만들어보기
- search input
- compose 함수
- 자바스크립트 검색 구현하기
- 노드교과서
- 올리브영 발색비교 기능구현하기
- 넥스트 검색엔진최적화
- 코어자바스트립트
- 리액트 이미지 미리보기
- 초집합
- next seo
- 자바스크립트로 달력만들기
- 순수함수
- 자바스크립트로 하는 자료 구조와 알고리즘
- react search input
- 자바스크립트
- 유저접근제한
- react-beautiful-dnd
- JavaScript
- 검색 자동완성
- new Promise()
Archives
- Today
- Total
미주알고주알
[Javascript] range 함수 직접 만들어보기 본문
시작점과 끝점 그리고 간격에 따라 그 배열을 출력할 수 있는 함수를 만들어보자.
가령, `range(1,5)` 면 `[1,2,3,4,5]`를, `range(1,5,2)`면 `[1,3,5]`, `range(1,5,-1)`면 `[5,4,3,2,1]` 를 출력하는 `range`함수 말이다.
가장 먼저, 범주가 만들어지지 않을 조건에 대해선 빈 배열값을 반환한다.
그 다음 start, end, step이 비어있을 경우에 대해 (조건에 따라) 초기값을 할당한다.
이때 step 값에 따라 배열을 순회하는 방향이 달라짐을 반영한다. (`until`)
이런 논리를 다음과 같은 코드로 옮겨보자.
if문을 사용하지 않고 삼항연사자를 써봤는데, 뭔가 더 읽기 어렵게 느껴지는 건 기분 탓일까?
const range = (start, end, step) => {
if (start !== end && (end - start) * step < 0) return [];
const tmp = start;
end = end ?? (start >= 0 ? ((start = start > 0 ? 1 : 0), tmp) : -1);
step = step ?? (start >= end ? -1 : 1);
const result = [start];
const until = x =>
step !== 0 && start !== end && (start > end ? x >= end : x <= end);
for (let i = start + step; until(i); i += step) {
result.push(i);
}
return result;
};
jest나 mocha 테스트 라이브러리는 아니지만 콘솔 상에서 다음의 여러 테스트 코드를 통과하는 지 살펴보자.
// 테스트
const eqArray = (arr1, arr2) => {
if (arr1.length !== arr2.length) return false;
for (let i = 0; i < arr1.length; i += 1) {
if (arr1[i] !== arr2[i]) return false;
}
return true;
};
const assertArray = (arr1, arr2) => {
if (eqArray(arr1, arr2)) {
console.log(arr1, arr2, '==>', '통!!');
return;
}
console.log(arr1, arr2, '==>', '불통!!');
};
assertArray(range(1, 10, 1), [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
assertArray(range(1, 10, 2), [1, 3, 5, 7, 9]);
assertArray(range(5, 5), [5]);
assertArray(range(5, 5, 1), [5]);
assertArray(range(0, 0), [0]);
assertArray(range(0), [0]);
assertArray(range(0, 0, 5), [0]);
assertArray(range(1, 10), [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
assertArray(range(10, 1), [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]);
assertArray(range(10, 1, -2), [10, 8, 6, 4, 2]);
assertArray(range(10, 1, -3), [10, 7, 4, 1]);
assertArray(range(5), [1, 2, 3, 4, 5]);
assertArray(
range(100),
Array.from({ length: 100 }, (_, i) => i + 1)
);
assertArray(range(-5), [-5, -4, -3, -2, -1]);
assertArray(range(5, 5, 0), [5]);
assertArray(range(5, 5, -1), [5]);
assertArray(range(5, 1, 1), []);
assertArray(range(1, 5, -1), []);
assertArray(range(1, 5, 6), [1]);
assertArray(range(2, 1, -5), [2]);
assertArray(range(0, -1, -5), [0]);
assertArray(range(0, -1, 0), [0]);
assertArray(range(0, 5), [0, 1, 2, 3, 4, 5]);
assertArray(range(0, -1), [0, -1]);
assertArray(range(0, -3), [0, -1, -2, -3]);
assertArray(range(-3, 0), [-3, -2, -1, 0]);
ㅎㅎ. 불통이 하나도 나오지 않음!!!!
완셩.
'Javascript' 카테고리의 다른 글
[React.js] 리액트로 검색 filter 및 highlight 기능 구현하기(+ debounce, throttle) (0) | 2023.03.28 |
---|---|
[Javascript] reduce 함수 직접 만들어보기 (0) | 2023.03.24 |
[Javascript] new Set 객체 활용하기(교집합, 합집합, 차집합, 초집합) (0) | 2023.03.24 |
[Javascript] iterator을 활용해 지하철 노선도 만들기 (1) | 2023.03.24 |
[Javascript] new Date 객체로 달력 만들어보기 (0) | 2023.03.24 |