미주알고주알

[Javascript] range 함수 직접 만들어보기 본문

Javascript

[Javascript] range 함수 직접 만들어보기

미주알고주알 2023. 3. 24. 18:54

시작점과 끝점 그리고 간격에 따라 그 배열을 출력할 수 있는 함수를 만들어보자.

가령, `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]);

 

ㅎㅎ. 불통이 하나도 나오지 않음!!!!

완셩.