Skip to content

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' }

注意事项

  1. 不可变性: 不会修改原对象
  2. 类型安全: 支持完整的 TypeScript 类型推断
  3. 不存在的属性: 会忽略不存在的属性
  4. 浅拷贝: 只进行浅拷贝,嵌套对象会共享引用

与其他函数的区别

  • pick: 选择指定的属性
  • omit: 排除指定的属性
  • keys: 获取对象的所有键
  • values: 获取对象的所有值

性能

  • 时间复杂度: O(n),其中 n 是键的数量
  • 空间复杂度: O(n)
  • 适用场景: 数据过滤、API响应处理

Released under the MIT License.