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)
- 适用场景: 数据分析和统计