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.