refactor(sortBy, orderBy): use same compareValues function in internal and fix type (#382)

* Refact compareValues

* Fix type error

* Fix docs
This commit is contained in:
Dayong Lee 2024-08-15 20:58:26 +09:00 committed by GitHub
parent d4037c755c
commit 321a1bf635
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 11 additions and 18 deletions

View File

@ -10,7 +10,7 @@ The function returns the array of objects sorted in ascending order. If two obje
## Signature
```typescript
function sortBy<T extends object>(arr: T[], criteria: Array<keyof T | ((item: T) => unknown)>): T[];
function sortBy<T extends object>(arr: T[], criteria: Array<((item: T) => unknown) | keyof T>): T[];
```
### Parameters

View File

@ -10,7 +10,7 @@
## 签名
```typescript
function sortBy<T extends object>(arr: T[], criteria: Array<keyof T | ((item: T) => unknown)>): T[];
function sortBy<T extends object>(arr: T[], criteria: Array<((item: T) => unknown) | keyof T>): T[];
```
### 参数

View File

@ -1,9 +1,9 @@
export function compareValues(a: any, b: any): 0 | -1 | 1 {
export function compareValues(a: any, b: any, order: 'asc' | 'desc'): 0 | -1 | 1 {
if (a < b) {
return -1;
return order === 'asc' ? -1 : 1;
}
if (a > b) {
return 1;
return order === 'asc' ? 1 : -1;
}
return 0;
}

View File

@ -1,3 +1,5 @@
import { compareValues } from '../_internal/compareValues';
type Order = 'asc' | 'desc';
/**
@ -32,16 +34,6 @@ type Order = 'asc' | 'desc';
* // ]
*/
export function orderBy<T>(collection: T[], keys: Array<keyof T>, orders: Order[]): T[] {
const compareValues = (a: T[keyof T], b: T[keyof T], order: Order) => {
if (a < b) {
return order === 'asc' ? -1 : 1;
}
if (a > b) {
return order === 'asc' ? 1 : -1;
}
return 0;
};
const effectiveOrders = keys.map((_, index) => orders[index] || orders[orders.length - 1]);
return collection.slice().sort((a, b) => {

View File

@ -11,7 +11,8 @@ import { compareValues } from '../_internal/compareValues';
*
* @template T - The type of the objects in the array.
* @param {T[]} arr - The array of objects to be sorted.
* @param {Array<(item: T) => unknown | keyof T>} criteria - The criteria for sorting. This can be an array of object keys or functions that return values used for sorting.
* @param {Array<((item: T) => unknown) | keyof T>} criteria - The criteria for sorting. This can be an array of object keys or functions that return values used for sorting.
* @returns {T[]} - The sorted array.
*
* @example
* const users = [
@ -31,7 +32,7 @@ import { compareValues } from '../_internal/compareValues';
* // { user : 'foo', age: 24 },
* // ]
*/
export function sortBy<T extends object>(arr: T[], criteria: Array<(item: T) => unknown | keyof T>): T[] {
export function sortBy<T extends object>(arr: T[], criteria: Array<((item: T) => unknown) | keyof T>): T[] {
return arr.slice().sort((a, b) => {
for (let i = 0; i < criteria.length; i++) {
const iteratee = criteria[i];
@ -40,7 +41,7 @@ export function sortBy<T extends object>(arr: T[], criteria: Array<(item: T) =>
const valueA = iterateeIsFunction ? iteratee(a) : a[iteratee];
const valueB = iterateeIsFunction ? iteratee(b) : b[iteratee];
const result = compareValues(valueA, valueB);
const result = compareValues(valueA, valueB, 'asc');
if (result !== 0) {
return result;