import { Meta } from '@storybook/addon-docs/blocks'

<Meta title='@dxtmisha/vi/functional-basic/Functions/forEach - Lặp qua đối tượng hoặc mảng'/>

# `forEach`

Hàm thực hiện chức năng được chỉ định một lần cho mỗi phần tử trong đối tượng. Và trả về một mảng với kết quả thực thi hàm.

**Tham số:**
- `data: D` — đối tượng để lặp.
- `callback: (item: T, key: K, dataMain: typeof data) => R` — một hàm để thực thi cho mỗi phần tử trong mảng.
- `saveUndefined?: boolean` — nếu `true`, hàm sẽ trả về một mảng bao gồm cả các giá trị `undefined` (mặc định sẽ bị lọc bỏ).

**Trả về:**
`R[]` — một mảng với kết quả thực thi hàm.

## Cơ chế hoạt động

Hàm này là một công cụ vạn năng để lặp qua các cấu trúc dữ liệu khác nhau và thu thập kết quả vào một mảng.

**Tính năng:**
- **Hỗ trợ kiểu dữ liệu** — hoạt động với `Array`, `Map`, `Set` và các đối tượng thông thường (`Object`).
- **Thu thập kết quả** — khác với `forEach` tiêu chuẩn, hàm này thu thập các giá trị được trả về từ `callback` vào một mảng mới.
- **Lọc undefined** — theo mặc định, tất cả các giá trị `undefined` (ví dụ: nếu callback không trả về gì cho một phần tử) sẽ bị lọc bỏ khỏi mảng kết quả.
- **Tham số saveUndefined** — nếu truyền `true` làm đối số thứ ba, mảng sẽ giữ lại tất cả các kết quả, bao gồm cả `undefined`.

## Ví dụ

```typescript
import { forEach } from '@dxtmisha/functional-basic'

const data = [1, 2, 3]

// Giá trị undefined bị lọc bỏ theo mặc định
forEach(data, (item) => item % 2 === 0 ? item : undefined) // [2]

// Với saveUndefined: true
forEach(data, (item) => item % 2 === 0 ? item : undefined, true) // [undefined, 2, undefined]
```
