cluster
將數組按指定條件分組。
語法
typescript
cluster<T>(
array: T[],
key: (item: T) => string | number
): Record<string | number, T[]>
參數
array
(T[]): 要分組的數組key
((item: T) => string | number): 用於分組的鍵提取函數
返回值
Record<string | number, T[]>
: 分組後的對象,鍵為分組條件,值為對應的數組
示例
基本用法
typescript
import { cluster } from 'radash'
const users = [
{ name: 'Alice', age: 25, city: 'New York' },
{ name: 'Bob', age: 30, city: 'Los Angeles' },
{ name: 'Charlie', age: 25, city: 'New York' },
{ name: 'Diana', age: 35, city: 'Los Angeles' }
]
const groupedByCity = cluster(users, user => user.city)
// {
// 'New York': [
// { name: 'Alice', age: 25, city: 'New York' },
// { name: 'Charlie', age: 25, city: 'New York' }
// ],
// 'Los Angeles': [
// { name: 'Bob', age: 30, city: 'Los Angeles' },
// { name: 'Diana', age: 35, city: 'Los Angeles' }
// ]
// }
按年齡分組
typescript
import { cluster } from 'radash'
const users = [
{ name: 'Alice', age: 25 },
{ name: 'Bob', age: 30 },
{ name: 'Charlie', age: 25 },
{ name: 'Diana', age: 35 },
{ name: 'Eve', age: 30 }
]
const groupedByAge = cluster(users, user => user.age)
// {
// 25: [
// { name: 'Alice', age: 25 },
// { name: 'Charlie', age: 25 }
// ],
// 30: [
// { name: 'Bob', age: 30 },
// { name: 'Eve', age: 30 }
// ],
// 35: [
// { name: 'Diana', age: 35 }
// ]
// }
按多個條件分組
typescript
import { cluster } from 'radash'
const products = [
{ name: 'Laptop', category: 'Electronics', price: 999 },
{ name: 'Phone', category: 'Electronics', price: 599 },
{ name: 'Book', category: 'Education', price: 29 },
{ name: 'Tablet', category: 'Electronics', price: 399 }
]
const groupedByCategory = cluster(products, product => product.category)
// {
// 'Electronics': [
// { name: 'Laptop', category: 'Electronics', price: 999 },
// { name: 'Phone', category: 'Electronics', price: 599 },
// { name: 'Tablet', category: 'Electronics', price: 399 }
// ],
// 'Education': [
// { name: 'Book', category: 'Education', price: 29 }
// ]
// }
按價格范圍分組
typescript
import { cluster } from 'radash'
const products = [
{ name: 'Laptop', price: 999 },
{ name: 'Phone', price: 599 },
{ name: 'Book', price: 29 },
{ name: 'Tablet', price: 399 },
{ name: 'Watch', price: 199 }
]
const getPriceRange = (price: number) => {
if (price < 100) return 'Budget'
if (price < 500) return 'Mid-range'
return 'Premium'
}
const groupedByPriceRange = cluster(products, product => getPriceRange(product.price))
// {
// 'Budget': [
// { name: 'Book', price: 29 }
// ],
// 'Mid-range': [
// { name: 'Watch', price: 199 },
// { name: 'Tablet', price: 399 }
// ],
// 'Premium': [
// { name: 'Phone', price: 599 },
// { name: 'Laptop', price: 999 }
// ]
// }
按日期分組
typescript
import { cluster } from 'radash'
const events = [
{ title: 'Meeting 1', date: new Date('2023-01-01') },
{ title: 'Meeting 2', date: new Date('2023-01-01') },
{ title: 'Meeting 3', date: new Date('2023-01-02') },
{ title: 'Meeting 4', date: new Date('2023-01-03') }
]
const groupedByDate = cluster(events, event =>
event.date.toISOString().split('T')[0]
)
// {
// '2023-01-01': [
// { title: 'Meeting 1', date: new Date('2023-01-01') },
// { title: 'Meeting 2', date: new Date('2023-01-01') }
// ],
// '2023-01-02': [
// { title: 'Meeting 3', date: new Date('2023-01-02') }
// ],
// '2023-01-03': [
// { title: 'Meeting 4', date: new Date('2023-01-03') }
// ]
// }
處理空值
typescript
import { cluster } from 'radash'
const items = [
{ name: 'Item 1', category: 'A' },
{ name: 'Item 2', category: null },
{ name: 'Item 3', category: 'B' },
{ name: 'Item 4', category: undefined }
]
const groupedByCategory = cluster(items, item => item.category || 'Uncategorized')
// {
// 'A': [
// { name: 'Item 1', category: 'A' }
// ],
// 'B': [
// { name: 'Item 3', category: 'B' }
// ],
// 'Uncategorized': [
// { name: 'Item 2', category: null },
// { name: 'Item 4', category: undefined }
// ]
// }
注意事項
- 鍵類型: 鍵必須是字符串或數字
- 空值處理: 需要手動處理 null 和 undefined 值
- 性能: 時間復雜度為 O(n)
- 順序: 不保證分組內元素的順序
與其他函數的區別
cluster
: 按條件分組,返回對象groupBy
: 類似功能,但可能有不同的實現partition
: 將數組分為兩部分
性能
- 時間復雜度: O(n)
- 空間復雜度: O(n)
- 適用場景: 數據分析和統計