Skip to content

select

根據條件過濾和轉換數組元素。

語法

typescript
select<T, R>(
  array: T[],
  transform: (item: T) => R,
  condition?: (item: T) => boolean
): R[]

參數

  • array (T[]): 要處理的數組
  • transform ((item: T) => R): 轉換函數
  • condition ((item: T) => boolean, 可選): 過濾條件

返回值

  • R[]: 過濾和轉換後的數組

示例

基本用法

typescript
import { select } from 'radash'

const users = [
  { name: 'Alice', age: 25 },
  { name: 'Bob', age: 30 },
  { name: 'Charlie', age: 35 }
]

const names = select(users, user => user.name)
// ['Alice', 'Bob', 'Charlie']

帶條件過濾

typescript
import { select } from 'radash'

const users = [
  { name: 'Alice', age: 25 },
  { name: 'Bob', age: 30 },
  { name: 'Charlie', age: 35 },
  { name: 'Diana', age: 20 }
]

const adultNames = select(
  users,
  user => user.name,
  user => user.age >= 25
)
// ['Alice', 'Bob', 'Charlie']

轉換和過濾

typescript
import { select } from 'radash'

const products = [
  { name: 'Laptop', price: 999 },
  { name: 'Phone', price: 599 },
  { name: 'Book', price: 29 },
  { name: 'Tablet', price: 399 }
]

const expensiveProducts = select(
  products,
  product => ({ ...product, isExpensive: true }),
  product => product.price > 500
)
// [
//   { name: 'Laptop', price: 999, isExpensive: true },
//   { name: 'Phone', price: 599, isExpensive: true }
// ]

處理嵌套對象

typescript
import { select } from 'radash'

const orders = [
  { id: 1, customer: { name: 'Alice', city: 'New York' } },
  { id: 2, customer: { name: 'Bob', city: 'Los Angeles' } },
  { id: 3, customer: { name: 'Charlie', city: 'New York' } }
]

const nyCustomers = select(
  orders,
  order => order.customer.name,
  order => order.customer.city === 'New York'
)
// ['Alice', 'Charlie']

數值計算

typescript
import { select } from 'radash'

const numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

const evenSquares = select(
  numbers,
  n => n * n,
  n => n % 2 === 0
)
// [4, 16, 36, 64, 100]

字符串處理

typescript
import { select } from 'radash'

const words = ['hello', 'world', 'javascript', 'typescript', 'react']

const longWords = select(
  words,
  word => word.toUpperCase(),
  word => word.length > 5
)
// ['JAVASCRIPT', 'TYPESCRIPT']

處理日期

typescript
import { select } from 'radash'

const events = [
  { title: 'Meeting 1', date: new Date('2023-01-01') },
  { title: 'Meeting 2', date: new Date('2023-01-15') },
  { title: 'Meeting 3', date: new Date('2023-02-01') }
]

const thisMonthEvents = select(
  events,
  event => event.title,
  event => event.date.getMonth() === 0 // 1月
)
// ['Meeting 1', 'Meeting 2']

復雜條件

typescript
import { select } from 'radash'

const employees = [
  { name: 'Alice', age: 25, department: 'Engineering', salary: 80000 },
  { name: 'Bob', age: 30, department: 'Sales', salary: 60000 },
  { name: 'Charlie', age: 35, department: 'Engineering', salary: 90000 },
  { name: 'Diana', age: 28, department: 'Marketing', salary: 70000 }
]

const seniorEngineers = select(
  employees,
  emp => ({ ...emp, level: 'Senior' }),
  emp => emp.department === 'Engineering' && emp.age >= 30
)
// [
//   { name: 'Charlie', age: 35, department: 'Engineering', salary: 90000, level: 'Senior' }
// ]

處理空值

typescript
import { select } 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 categorizedItems = select(
  items,
  item => item.name,
  item => item.category != null
)
// ['Item 1', 'Item 3']

鏈式操作

typescript
import { select } from 'radash'

const numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

// 先過濾偶數,再轉換為字符串
const evenStrings = select(
  numbers,
  n => n.toString(),
  n => n % 2 === 0
)
// ['2', '4', '6', '8', '10']

// 再過濾長度大於1的字符串
const longEvenStrings = select(
  evenStrings,
  s => s,
  s => s.length > 1
)
// ['10']

注意事項

  1. 轉換函數: 必須提供轉換函數
  2. 條件函數: 條件函數是可選的
  3. 性能: 時間復雜度為 O(n)
  4. 類型安全: 支持完整的 TypeScript 類型推斷

與其他函數的區別

  • select: 同時進行過濾和轉換
  • map: 只進行轉換
  • filter: 只進行過濾
  • map + filter: 需要兩次遍歷

性能

  • 時間復雜度: O(n)
  • 空間復雜度: O(n)
  • 適用場景: 數據轉換和過濾

Released under the MIT License.