Skip to content

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 }
//   ]
// }

注意事项

  1. 键类型: 键必须是字符串或数字
  2. 空值处理: 需要手动处理 null 和 undefined 值
  3. 性能: 时间复杂度为 O(n)
  4. 顺序: 不保证分组内元素的顺序

与其他函数的区别

  • cluster: 按条件分组,返回对象
  • groupBy: 类似功能,但可能有不同的实现
  • partition: 将数组分为两部分

性能

  • 时间复杂度: O(n)
  • 空间复杂度: O(n)
  • 适用场景: 数据分析和统计

Released under the MIT License.