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']
注意事项
- 转换函数: 必须提供转换函数
- 条件函数: 条件函数是可选的
- 性能: 时间复杂度为 O(n)
- 类型安全: 支持完整的 TypeScript 类型推断
与其他函数的区别
select
: 同时进行过滤和转换map
: 只进行转换filter
: 只进行过滤map
+filter
: 需要两次遍历
性能
- 时间复杂度: O(n)
- 空间复杂度: O(n)
- 适用场景: 数据转换和过滤