Skip to main content

flattenDeep

flatten 을 기반으로 주어진 중첩 배열의 모든 깊이평탄화해주는 함수입니다.

JavaScript에서 기본적으로 제공하는 Array.prototype.flat(Infinity) 와 비교했을 때 성능면에서 더 우수하며, 더욱 정확한 타입 추론을 할 수 있습니다.

typescript
// as-is 
// Array.prototype.flat(Infinity)
const arr = [1, [2, [3]]].flat(Infinity);
/*
* const arr: FlatArray<number | (number | number[])[], 0 | 1 | 2 | 3 | -1 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20>[]
*/
typescript
// to-be 
// flattenDeep
const arr = flattenDeep([1, [2, [3]]]);
/*
* const arr: number[]
*/

Code

🔗 실제 구현 코드 확인

Benchmark

  • hz: 초당 작업 수
  • mean: 평균 응답 시간(ms)
이름hzmean성능
modern-kit/flattenDeep2,028,846.090.0005fastest
lodash/flattenDeep1,481,161.980.0007-
js built-in/flat(Infinity)340,193.060.0029slowest
  • modern-kit/flattenDeep
    • 1.40x faster than lodash/flattenDeep
    • 5.99x faster than js built-in/flat(Infinity)

Interface

typescript
/**
* @description 중첩된 배열 타입을 재귀적으로 풀어내어 가장 내부의 요소 타입을 추출하는 유틸리티 타입
*/
type ExtractNestedArrayType<T> = T extends readonly (infer U)[] ? ExtractNestedArrayType<U> : T;
typescript
function flattenDeep<T>(arr: T[] | readonly T[]): ExtractNestedArrayType<T>[]

Usage

typescript
import { flattenDeep } from '@modern-kit/utils';

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

flattenDeep(arr); // [1, 2, 3, 4, 5]