pick
从对象中选择指定的属性,创建新对象。
语法
typescript
pick<T, K extends keyof T>(
object: T,
keys: K[]
): Pick<T, K>
参数
object
(T): 源对象keys
(K[]): 要选择的属性键数组
返回值
Pick<T, K>
: 包含指定属性的新对象
示例
基本用法
typescript
import { pick } from 'radash'
const user = {
id: 1,
name: 'Alice',
email: 'alice@example.com',
age: 25,
city: 'New York'
}
const userInfo = pick(user, ['name', 'email'])
// { name: 'Alice', email: 'alice@example.com' }
选择单个属性
typescript
import { pick } from 'radash'
const product = {
id: 123,
name: 'Laptop',
price: 999,
category: 'Electronics'
}
const productName = pick(product, ['name'])
// { name: 'Laptop' }
选择多个属性
typescript
import { pick } from 'radash'
const order = {
id: 'ORD-001',
customerId: 456,
items: ['item1', 'item2'],
total: 150.00,
status: 'pending',
createdAt: new Date()
}
const orderSummary = pick(order, ['id', 'total', 'status'])
// { id: 'ORD-001', total: 150.00, status: 'pending' }
处理嵌套对象
typescript
import { pick } from 'radash'
const user = {
id: 1,
profile: {
firstName: 'Alice',
lastName: 'Smith',
age: 25
},
settings: {
theme: 'dark',
language: 'en'
}
}
const userProfile = pick(user, ['profile'])
// { profile: { firstName: 'Alice', lastName: 'Smith', age: 25 } }
处理不存在的属性
typescript
import { pick } from 'radash'
const user = {
name: 'Alice',
age: 25
}
const result = pick(user, ['name', 'email', 'age'])
// { name: 'Alice', age: 25 }
// 注意:不存在的属性 'email' 会被忽略
处理空对象
typescript
import { pick } from 'radash'
const emptyObj = {}
const result = pick(emptyObj, ['name', 'age'])
// {}
处理空键数组
typescript
import { pick } from 'radash'
const user = {
name: 'Alice',
age: 25
}
const result = pick(user, [])
// {}
处理函数属性
typescript
import { pick } from 'radash'
const component = {
name: 'Button',
render: () => '<button>Click me</button>',
props: { text: 'Click me' }
}
const componentInfo = pick(component, ['name', 'props'])
// { name: 'Button', props: { text: 'Click me' } }
处理数组属性
typescript
import { pick } from 'radash'
const user = {
id: 1,
name: 'Alice',
hobbies: ['reading', 'swimming'],
tags: ['developer', 'frontend']
}
const userBasic = pick(user, ['name', 'hobbies'])
// { name: 'Alice', hobbies: ['reading', 'swimming'] }
处理日期属性
typescript
import { pick } from 'radash'
const event = {
id: 1,
title: 'Meeting',
date: new Date('2023-01-01'),
duration: 60,
attendees: ['Alice', 'Bob']
}
const eventInfo = pick(event, ['title', 'date'])
// { title: 'Meeting', date: new Date('2023-01-01') }
处理布尔值属性
typescript
import { pick } from 'radash'
const user = {
id: 1,
name: 'Alice',
isActive: true,
isAdmin: false,
email: 'alice@example.com'
}
const userStatus = pick(user, ['isActive', 'isAdmin'])
// { isActive: true, isAdmin: false }
处理null和undefined值
typescript
import { pick } from 'radash'
const user = {
name: 'Alice',
email: null,
phone: undefined,
age: 25
}
const userContact = pick(user, ['email', 'phone', 'age'])
// { email: null, phone: undefined, age: 25 }
处理Symbol属性
typescript
import { pick } from 'radash'
const sym = Symbol('key')
const obj = {
[sym]: 'value',
name: 'Alice',
age: 25
}
const result = pick(obj, [sym, 'name'])
// { [Symbol(key)]: 'value', name: 'Alice' }
处理复杂对象
typescript
import { pick } from 'radash'
const complexObject = {
id: 1,
metadata: {
createdAt: new Date(),
version: '1.0.0'
},
data: {
items: [1, 2, 3],
total: 100
},
config: {
theme: 'dark',
language: 'en'
}
}
const essentialData = pick(complexObject, ['id', 'metadata', 'data'])
// {
// id: 1,
// metadata: { createdAt: new Date(), version: '1.0.0' },
// data: { items: [1, 2, 3], total: 100 }
// }
处理API响应
typescript
import { pick } from 'radash'
const apiResponse = {
data: {
users: [
{ id: 1, name: 'Alice', email: 'alice@example.com' },
{ id: 2, name: 'Bob', email: 'bob@example.com' }
],
total: 2,
page: 1,
limit: 10
},
status: 200,
message: 'Success',
timestamp: new Date()
}
const userData = pick(apiResponse, ['data', 'status'])
// {
// data: { users: [...], total: 2, page: 1, limit: 10 },
// status: 200
// }
处理表单数据
typescript
import { pick } from 'radash'
const formData = {
firstName: 'Alice',
lastName: 'Smith',
email: 'alice@example.com',
password: 'secret123',
confirmPassword: 'secret123',
terms: true
}
const publicInfo = pick(formData, ['firstName', 'lastName', 'email'])
// { firstName: 'Alice', lastName: 'Smith', email: 'alice@example.com' }
注意事项
- 不可变性: 不会修改原对象
- 类型安全: 支持完整的 TypeScript 类型推断
- 不存在的属性: 会忽略不存在的属性
- 浅拷贝: 只进行浅拷贝,嵌套对象会共享引用
与其他函数的区别
pick
: 选择指定的属性omit
: 排除指定的属性keys
: 获取对象的所有键values
: 获取对象的所有值
性能
- 时间复杂度: O(n),其中 n 是键的数量
- 空间复杂度: O(n)
- 适用场景: 数据过滤、API响应处理