-
Notifications
You must be signed in to change notification settings - Fork 358
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
8 changed files
with
1,018 additions
and
33 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,155 @@ | ||
# findLast | ||
|
||
::: info | ||
この関数は互換性のために `es-toolkit/compat` からのみインポートできます。代替可能なネイティブ JavaScript API があるか、まだ十分に最適化されていないためです。 | ||
|
||
`es-toolkit/compat` からこの関数をインポートすると、[lodash と完全に同じように動作](../../../compatibility.md)します。 | ||
::: | ||
|
||
配列やオブジェクトから条件に合う最後の値を見つけます。 | ||
|
||
条件は複数の方法で指定できます。 | ||
|
||
- **検査関数**: 各要素に対して検査する関数を実行します。最後に `true` を返す値が選択されます。 | ||
- **部分オブジェクト**: 与えられたオブジェクトと部分的に一致する最後の要素が選択されます。 | ||
- **プロパティ-値ペア**: 該当プロパティに対して値が一致する最後の要素が選択されます。 | ||
- **プロパティ名**: 該当プロパティに対して真と評価される値を持つ最後の要素が選択されます。 | ||
|
||
## インターフェース | ||
|
||
```typescript | ||
function findLast<T>( | ||
arr: T[], | ||
doesMatch: (item: T, index: number, arr: T[]) => unknown, | ||
fromIndex?: number | ||
): T | undefined; | ||
function findLast<T>(arr: T[], doesMatch: Partial<T>, fromIndex?: number): T | undefined; | ||
function findLast<T>(arr: T[], doesMatch: [keyof T, unknown], fromIndex?: number): T | undefined; | ||
function findLast<T>(arr: T[], doesMatch: PropertyKey, fromIndex?: number): T | undefined; | ||
|
||
function findLast<T extends Record<string, unknown>>( | ||
object: T, | ||
doesMatch: (item: T[keyof T], index: number, object: T) => unknown, | ||
fromIndex?: number | ||
): T | undefined; | ||
function findLast<T extends Record<string, unknown>>( | ||
object: T, | ||
doesMatch: Partial<T[keyof T]>, | ||
fromIndex?: number | ||
): T | undefined; | ||
function findLast<T extends Record<string, unknown>>( | ||
object: T, | ||
doesMatch: [keyof T[keyof T], unknown], | ||
fromIndex?: number | ||
): T | undefined; | ||
function findLast<T extends Record<string, unknown>>( | ||
object: T, | ||
doesMatch: PropertyKey, | ||
fromIndex?: number | ||
): T | undefined; | ||
``` | ||
|
||
### パラメータ | ||
|
||
- `arr` (`T[]`) または `object` (`T`): 検索する配列またはオブジェクト。 | ||
|
||
::: info `arr` は `ArrayLike<T>` であるか、`null` または `undefined` である可能性があります | ||
|
||
lodash と完全に互換性があるように、`find` 関数は `arr` を次のように処理します。 | ||
|
||
- `arr` が `ArrayLike<T>` の場合、`Array.from(...)` を使用して配列に変換します。 | ||
- `arr` が `null` または `undefined` の場合、空の配列と見なされます。 | ||
|
||
::: | ||
|
||
::: info `object` は `null` または `undefined` である可能性があります | ||
|
||
lodash と完全に互換性があるように、`find` 関数は `object` を次のように処理します。 | ||
|
||
- `object` が `null` または `undefined` の場合、空のオブジェクトに変換されます。 | ||
|
||
::: | ||
|
||
- `doesMatch`: | ||
|
||
- 配列の場合: | ||
|
||
- **検査関数** (`(item: T, index: number, arr: T[]) => unknown`): 探している要素かどうかを返す関数。 | ||
- **部分オブジェクト** (`Partial<T>`): 一致させるプロパティと値を指定した部分オブジェクト。 | ||
- **プロパティ-値ペア** (`[keyof T, unknown]`): 最初が一致させるプロパティ、2番目が一致させる値を表すタプル。 | ||
- **プロパティ名** (`PropertyKey`): 真と評価される値を持っているか確認するプロパティ名。 | ||
|
||
- オブジェクトの場合: | ||
- **検査関数** (`(item: T[keyof T], index: number, object: T) => unknown`): 探している要素かどうかを返す関数。 | ||
- **部分値** (`Partial<T[keyof T]>`): 一致させるプロパティと値を指定した部分オブジェクト。 | ||
- **プロパティ-値ペア** (`[keyof T[keyof T], unknown]`): 最初が一致させるプロパティ、2番目が一致させる値を表すタプル。 | ||
- **プロパティ名** (`PropertyKey`): 真と評価される値を持っているか確認するプロパティ名。 | ||
|
||
- `fromIndex` (`number`): 検索を開始するインデックス。デフォルトは `0`。 | ||
|
||
### 戻り値 | ||
|
||
(`T | undefined`): 与えられた条件を満たす最初の要素。ない場合は `undefined`。 | ||
|
||
## 例 | ||
|
||
### 配列の場合 | ||
|
||
```typescript | ||
import { find } from 'es-toolkit/compat'; | ||
|
||
// 検査関数を使う場合 | ||
const items = [1, 2, 3, 4, 5]; | ||
const result = find(items, item => item > 3); | ||
console.log(result); // 5 | ||
|
||
// 部分オブジェクトを使う場合 | ||
const items = [ | ||
{ id: 1, name: 'Alice' }, | ||
{ id: 2, name: 'Bob' }, | ||
]; | ||
const result = find(items, { name: 'Bob' }); | ||
console.log(result); // { id: 2, name: 'Bob' } | ||
|
||
// プロパティ-値ペアを使う場合 | ||
const items = [ | ||
{ id: 1, name: 'Alice' }, | ||
{ id: 2, name: 'Bob' }, | ||
]; | ||
const result = find(items, ['name', 'Alice']); | ||
console.log(result); // { id: 1, name: 'Alice' } | ||
|
||
// プロパティ名を使う場合 | ||
const items = [ | ||
{ id: 1, name: 'Alice' }, | ||
{ id: 2, name: 'Bob' }, | ||
]; | ||
const result = find(items, 'name'); | ||
console.log(result); // { id: 2, name: 'Bob' } | ||
``` | ||
|
||
### オブジェクトの場合 | ||
|
||
```typescript | ||
import { find } from 'es-toolkit/compat'; | ||
|
||
// 検査関数を使う場合 | ||
const obj = { a: 1, b: 2, c: 3 }; | ||
const result = find(obj, item => item > 2); | ||
console.log(result); // 3 | ||
|
||
// 部分オブジェクトを使う場合 | ||
const obj = { a: { id: 1, name: 'Alice' }, b: { id: 2, name: 'Bob' } }; | ||
const result = find(obj, { name: 'Bob' }); | ||
console.log(result); // { id: 2, name: 'Bob' } | ||
|
||
// プロパティ-値ペアを使う場合 | ||
const items = { alice: { id: 1, name: 'Alice' }, bob: { id: 2, name: 'Bob' } }; | ||
const result = find(items, ['name', 'Alice']); | ||
console.log(result); // { id: 1, name: 'Alice' } | ||
|
||
// プロパティ名を使う場合 | ||
const obj = { a: { id: 1, name: 'Alice' }, b: { id: 2, name: 'Bob' } }; | ||
const result = find(obj, 'name'); | ||
console.log(result); // { id: 2, name: 'Bob' } | ||
``` |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,155 @@ | ||
# findLast | ||
|
||
::: info | ||
이 함수는 호환성을 위한 `es-toolkit/compat` 에서만 가져올 수 있어요. 대체할 수 있는 네이티브 JavaScript API가 있거나, 아직 충분히 최적화되지 않았기 때문이에요. | ||
|
||
`es-toolkit/compat`에서 이 함수를 가져오면, [lodash와 완전히 똑같이 동작](../../../compatibility.md)해요. | ||
::: | ||
|
||
배열이나 객체에서 조건에 맞는 마지막 값을 찾아요. | ||
|
||
조건은 여러 방법들로 명시할 수 있어요. | ||
|
||
- **검사 함수**: 각각의 요소에 대해서 검사하는 함수를 실행해요. 마지막으로 `true`를 반환하게 하는 값이 선택돼요. | ||
- **부분 객체**: 주어진 객체와 부분적으로 일치하는 마지막 요소가 선택돼요. | ||
- **프로퍼티-값 쌍**: 해당 프로퍼티에 대해서 값이 일치하는 마지막 요소가 선택돼요. | ||
- **프로퍼티 이름**: 해당 프로퍼티에 대해서 참으로 평가되는 값을 가지는 마지막 요소가 선택돼요. | ||
|
||
## 인터페이스 | ||
|
||
```typescript | ||
function findLast<T>( | ||
arr: T[], | ||
doesMatch: (item: T, index: number, arr: T[]) => unknown, | ||
fromIndex?: number | ||
): T | undefined; | ||
function findLast<T>(arr: T[], doesMatch: Partial<T>, fromIndex?: number): T | undefined; | ||
function findLast<T>(arr: T[], doesMatch: [keyof T, unknown], fromIndex?: number): T | undefined; | ||
function findLast<T>(arr: T[], doesMatch: PropertyKey, fromIndex?: number): T | undefined; | ||
|
||
function findLast<T extends Record<string, unknown>>( | ||
object: T, | ||
doesMatch: (item: T[keyof T], index: number, object: T) => unknown, | ||
fromIndex?: number | ||
): T | undefined; | ||
function findLast<T extends Record<string, unknown>>( | ||
object: T, | ||
doesMatch: Partial<T[keyof T]>, | ||
fromIndex?: number | ||
): T | undefined; | ||
function findLast<T extends Record<string, unknown>>( | ||
object: T, | ||
doesMatch: [keyof T[keyof T], unknown], | ||
fromIndex?: number | ||
): T | undefined; | ||
function findLast<T extends Record<string, unknown>>( | ||
object: T, | ||
doesMatch: PropertyKey, | ||
fromIndex?: number | ||
): T | undefined; | ||
``` | ||
|
||
### 파라미터 | ||
|
||
- `arr` (`T[]`) or `object` (`T`): 검색할 배열이나 객체. | ||
|
||
::: info `arr`는 `ArrayLike<T>`일 수도 있고, `null` 또는 `undefined`일 수도 있어요 | ||
|
||
lodash와 완벽하게 호환되도록 `find` 함수는 `arr`을 다음과 같이 처리해요: | ||
|
||
- `arr`가 `ArrayLike<T>`인 경우 `Array.from(...)`을 사용하여 배열로 변환해요. | ||
- `arr`가 `null` 또는 `undefined`인 경우 빈 배열로 간주돼요. | ||
|
||
::: | ||
|
||
::: info `object`는 `null` 또는 `undefined`일 수도 있어요 | ||
|
||
lodash와 완벽하게 호환되도록 `find` 함수는 `object`를 다음과 같이 처리해요: | ||
|
||
- `object`가 `null` 또는 `undefined`인 경우 빈 객체로 변환돼요. | ||
|
||
::: | ||
|
||
- `doesMatch`: | ||
|
||
- 배열의 경우: | ||
|
||
- **검사 함수** (`(item: T, index: number, arr: T[]) => unknown`): 찾는 요소인지 여부를 반환하는 함수. | ||
- **부분 객체** (`Partial<T>`): 일치시킬 프로퍼티와 값들을 명시한 부분 객체. | ||
- **프로퍼티-값 쌍** (`[keyof T, unknown]`): 첫 번째가 일치시킬 프로퍼티, 두 번째가 일치시킬 값을 나타내는 튜플. | ||
- **프로퍼티 이름** (`PropertyKey`): 참으로 평가되는 값을 가지고 있는지 확인할 프로퍼티 이름. | ||
|
||
- 객체의 경우: | ||
- **검사 함수** (`(item: T[keyof T], index: number, object: T) => unknown`): 찾는 요소인지 여부를 반환하는 함수. | ||
- **Partial value** (`Partial<T[keyof T]>`): 일치시킬 프로퍼티와 값들을 명시한 부분 객체. | ||
- **Property-value pair** (`[keyof T[keyof T], unknown]`): 첫 번째가 일치시킬 프로퍼티, 두 번째가 일치시킬 값을 나타내는 튜플. | ||
- **Property name** (`PropertyKey`): 참으로 평가되는 값을 가지고 있는지 확인할 프로퍼티 이름. | ||
|
||
- `fromIndex` (`number`): 검색을 시작할 인덱스. 기본값은 `0`. | ||
|
||
### 반환 값 | ||
|
||
(`T | undefined`): 주어진 조건을 만족하는 첫 번째 요소. 없으면 `undefined`. | ||
|
||
## 예시 | ||
|
||
### 배열의 경우 | ||
|
||
```typescript | ||
import { findLast } from 'es-toolkit/compat'; | ||
|
||
// 검사 함수를 쓰는 경우 | ||
const items = [1, 2, 3, 4, 5]; | ||
const result = findLast(items, item => item > 3); | ||
console.log(result); // 5 | ||
|
||
// 부분 객체를 쓰는 경우 | ||
const items = [ | ||
{ id: 1, name: 'Alice' }, | ||
{ id: 2, name: 'Bob' }, | ||
]; | ||
const result = findLast(items, { name: 'Bob' }); | ||
console.log(result); // { id: 2, name: 'Bob' } | ||
|
||
// 프로퍼티-값 쌍을 쓰는 경우 | ||
const items = [ | ||
{ id: 1, name: 'Alice' }, | ||
{ id: 2, name: 'Bob' }, | ||
]; | ||
const result = findLast(items, ['name', 'Alice']); | ||
console.log(result); // { id: 1, name: 'Alice' } | ||
|
||
// 프로퍼티 이름을 쓰는 경우 | ||
const items = [ | ||
{ id: 1, name: 'Alice' }, | ||
{ id: 2, name: 'Bob' }, | ||
]; | ||
const result = findLast(items, 'name'); | ||
console.log(result); // { id: 2, name: 'Bob' } | ||
``` | ||
|
||
### 객체의 경우 | ||
|
||
```typescript | ||
import { findLast } from 'es-toolkit/compat'; | ||
|
||
// 검사 함수를 쓰는 경우 | ||
const obj = { a: 1, b: 2, c: 3 }; | ||
const result = findLast(obj, item => item > 2); | ||
console.log(result); // 3 | ||
|
||
// 부분 객체를 쓰는 경우 | ||
const obj = { a: { id: 1, name: 'Alice' }, b: { id: 2, name: 'Bob' } }; | ||
const result = findLast(obj, { name: 'Bob' }); | ||
console.log(result); // { id: 2, name: 'Bob' } | ||
|
||
// 프로퍼티-값 쌍을 쓰는 경우 | ||
const items = { alice: { id: 1, name: 'Alice' }, bob: { id: 2, name: 'Bob' } }; | ||
const result = findLast(items, ['name', 'Alice']); | ||
console.log(result); // { id: 1, name: 'Alice' } | ||
|
||
// 프로퍼티 이름을 쓰는 경우 | ||
const obj = { a: { id: 1, name: 'Alice' }, b: { id: 2, name: 'Bob' } }; | ||
const result = findLast(obj, 'name'); | ||
console.log(result); // { id: 2, name: 'Bob' } | ||
``` |
Oops, something went wrong.