🛠️ 처음부터 만드는 Flatten — 중첩 배열을 평탄화하기
# 중첩 배열을 한 단계로 펴기
배열 속 배열이 있을 때, 이를 평탄화하는 `flatten` 함수를 만들어봅시다.
```javascript
function flatten(arr, depth = Infinity) {
let result = [];
for (const item of arr) {
if (Array.isArray(item) && depth > 0) {
result = result.concat(flatten(item, depth - 1));
} else {
result.push(item);
}
}
return result;
}
console.log(flatten([1, [2, [3, 4]], 5]));
// [1, 2, 3, 4, 5]
console.log(flatten([1, [2, [3, 4]], 5], 1));
// [1, 2, [3, 4], 5]
```
```javascript
const flatten = (arr, depth = Infinity) =>
arr.reduce((acc, val) =>
acc.concat(Array.isArray(val) && depth > 0
? flatten(val, depth - 1)
: val),
[]);
```
최신 JavaScript(ES2019+)에서는 네이티브 `flat()` 메서드를 사용하세요:
```javascript
const arr = [1, [2, [3, 4]], 5];
console.log(arr.flat(Infinity)); // [1, 2, 3, 4, 5]
```
이 방법이 가장 최적화되어 있습니다. [MDN 문서](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/flat)
깊이가 정해진 경우 → `flat(1)`, `flat(2)` 사용
모든 깊이 펴기 → `flat(Infinity)`
성능 중요 → 네이티브 `flat()` 사용 (C++ 구현)
레거시 환경 → 직접 재귀 구현
대부분의 경우 내장 API로 충분합니다!
배열 속 배열이 있을 때, 이를 평탄화하는 `flatten` 함수를 만들어봅시다.
기본 구현 — 재귀
```javascript
function flatten(arr, depth = Infinity) {
let result = [];
for (const item of arr) {
if (Array.isArray(item) && depth > 0) {
result = result.concat(flatten(item, depth - 1));
} else {
result.push(item);
}
}
return result;
}
console.log(flatten([1, [2, [3, 4]], 5]));
// [1, 2, 3, 4, 5]
console.log(flatten([1, [2, [3, 4]], 5], 1));
// [1, 2, [3, 4], 5]
```
Reduce를 사용한 함수형
```javascript
const flatten = (arr, depth = Infinity) =>
arr.reduce((acc, val) =>
acc.concat(Array.isArray(val) && depth > 0
? flatten(val, depth - 1)
: val),
[]);
```
내장 API — Array.prototype.flat()
최신 JavaScript(ES2019+)에서는 네이티브 `flat()` 메서드를 사용하세요:
```javascript
const arr = [1, [2, [3, 4]], 5];
console.log(arr.flat(Infinity)); // [1, 2, 3, 4, 5]
```
이 방법이 가장 최적화되어 있습니다. [MDN 문서](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/flat)
실무 팁
대부분의 경우 내장 API로 충분합니다!
👁 0 views
Comments (0)
💬
No comments yet.
Be the first to comment!