get
安全地獲取對象的嵌套屬性值,支持路徑字符串和默認值。
基礎用法
typescript
import { get } from 'radash'
const user = {
name: 'Alice',
address: {
city: 'Beijing',
country: 'China'
}
}
console.log(get(user, 'name')) // 'Alice'
console.log(get(user, 'address.city')) // 'Beijing'
console.log(get(user, 'address.zip', 'Unknown')) // 'Unknown'
console.log(get(user, 'nonexistent', 'Default')) // 'Default'
語法
typescript
function get<T = any>(
obj: any,
path: string | string[],
fallback?: T
): T
參數
obj
(any): 要查詢的對象path
(string | string[]): 屬性路徑,可以是字符串(用點分隔)或數組fallback
(T, 可選): 當路徑不存在時返回的默認值
返回值
返回指定路徑的值,如果路徑不存在則返回默認值。
示例
基本屬性訪問
typescript
import { get } from 'radash'
const user = {
id: 1,
name: 'Alice',
email: 'alice@example.com'
}
console.log(get(user, 'name')) // 'Alice'
console.log(get(user, 'email')) // 'alice@example.com'
console.log(get(user, 'age', 25)) // 25 (默認值)
嵌套屬性訪問
typescript
import { get } from 'radash'
const user = {
id: 1,
profile: {
name: 'Alice',
address: {
city: 'Beijing',
country: 'China',
details: {
street: 'Main Street',
zip: '100000'
}
}
}
}
console.log(get(user, 'profile.name')) // 'Alice'
console.log(get(user, 'profile.address.city')) // 'Beijing'
console.log(get(user, 'profile.address.details.street')) // 'Main Street'
console.log(get(user, 'profile.address.details.phone')) // undefined
數組路徑訪問
typescript
import { get } from 'radash'
const user = {
id: 1,
profile: {
name: 'Alice',
hobbies: ['reading', 'swimming', 'coding']
}
}
console.log(get(user, 'profile.hobbies.0')) // 'reading'
console.log(get(user, 'profile.hobbies.1')) // 'swimming'
console.log(get(user, 'profile.hobbies.5')) // undefined
console.log(get(user, 'profile.hobbies.5', [])) // []
處理復雜對象
typescript
import { get } from 'radash'
const data = {
users: [
{
id: 1,
name: 'Alice',
settings: {
theme: 'dark',
notifications: {
email: true,
push: false
}
}
},
{
id: 2,
name: 'Bob',
settings: {
theme: 'light',
notifications: {
email: false,
push: true
}
}
}
],
config: {
api: {
baseUrl: 'https://api.example.com',
timeout: 5000
}
}
}
console.log(get(data, 'users.0.name')) // 'Alice'
console.log(get(data, 'users.1.settings.theme')) // 'light'
console.log(get(data, 'config.api.baseUrl')) // 'https://api.example.com'
console.log(get(data, 'users.0.settings.notifications.push')) // false
使用數組路徑
typescript
import { get } from 'radash'
const user = {
profile: {
name: 'Alice',
address: {
city: 'Beijing'
}
}
}
// 使用數組路徑
console.log(get(user, ['profile', 'name'])) // 'Alice'
console.log(get(user, ['profile', 'address', 'city'])) // 'Beijing'
console.log(get(user, ['profile', 'age'], 25)) // 25
處理API響應
typescript
import { get } from 'radash'
function processApiResponse(response: any) {
return {
userId: get(response, 'data.user.id', 0),
userName: get(response, 'data.user.name', 'Unknown'),
userEmail: get(response, 'data.user.email', ''),
userRole: get(response, 'data.user.role', 'user'),
lastLogin: get(response, 'data.user.lastLogin', null)
}
}
const apiResponse = {
data: {
user: {
id: 123,
name: 'Alice',
email: 'alice@example.com'
// role 和 lastLogin 不存在
}
}
}
const processed = processApiResponse(apiResponse)
console.log(processed)
// {
// userId: 123,
// userName: 'Alice',
// userEmail: 'alice@example.com',
// userRole: 'user',
// lastLogin: null
// }
處理表單數據
typescript
import { get } from 'radash'
function processFormData(formData: FormData) {
return {
firstName: get(formData, 'user.firstName', ''),
lastName: get(formData, 'user.lastName', ''),
email: get(formData, 'user.email', ''),
address: {
street: get(formData, 'address.street', ''),
city: get(formData, 'address.city', ''),
zip: get(formData, 'address.zip', '')
},
preferences: {
newsletter: get(formData, 'preferences.newsletter', false),
notifications: get(formData, 'preferences.notifications', true)
}
}
}
// 模擬表單數據
const mockFormData = {
user: {
firstName: 'Alice',
lastName: 'Smith',
email: 'alice@example.com'
},
address: {
street: '123 Main St',
city: 'Beijing'
// zip 不存在
},
preferences: {
newsletter: true
// notifications 不存在
}
}
const processed = processFormData(mockFormData)
console.log(processed)
處理配置對象
typescript
import { get } from 'radash'
function parseConfig(config: any) {
return {
server: {
port: get(config, 'server.port', 3000),
host: get(config, 'server.host', 'localhost'),
timeout: get(config, 'server.timeout', 5000)
},
database: {
url: get(config, 'database.url', ''),
pool: {
min: get(config, 'database.pool.min', 1),
max: get(config, 'database.pool.max', 10)
}
},
features: {
cache: get(config, 'features.cache', false),
logging: get(config, 'features.logging', true)
}
}
}
const config = {
server: {
port: 8080,
host: '0.0.0.0'
// timeout 不存在
},
database: {
url: 'postgresql://localhost:5432/mydb',
pool: {
min: 2
// max 不存在
}
}
// features 不存在
}
const parsed = parseConfig(config)
console.log(parsed)
處理嵌套數組
typescript
import { get } from 'radash'
const data = {
departments: [
{
name: 'Engineering',
employees: [
{ id: 1, name: 'Alice', role: 'Developer' },
{ id: 2, name: 'Bob', role: 'Manager' }
]
},
{
name: 'Marketing',
employees: [
{ id: 3, name: 'Charlie', role: 'Designer' }
]
}
]
}
console.log(get(data, 'departments.0.name')) // 'Engineering'
console.log(get(data, 'departments.0.employees.0.name')) // 'Alice'
console.log(get(data, 'departments.1.employees.0.role')) // 'Designer'
console.log(get(data, 'departments.2.employees.0.name', 'N/A')) // 'N/A'
處理動態路徑
typescript
import { get } from 'radash'
function getNestedValue(obj: any, pathParts: string[], defaultValue: any = undefined) {
const path = pathParts.join('.')
return get(obj, path, defaultValue)
}
const user = {
profile: {
personal: {
name: 'Alice',
age: 25
},
work: {
company: 'Tech Corp',
position: 'Developer'
}
}
}
console.log(getNestedValue(user, ['profile', 'personal', 'name'])) // 'Alice'
console.log(getNestedValue(user, ['profile', 'work', 'company'])) // 'Tech Corp'
console.log(getNestedValue(user, ['profile', 'personal', 'email'], 'N/A')) // 'N/A'
處理條件訪問
typescript
import { get } from 'radash'
function getConditionalValue(obj: any, condition: string, truePath: string, falsePath: string) {
const conditionValue = get(obj, condition, false)
const path = conditionValue ? truePath : falsePath
return get(obj, path, 'Default')
}
const user = {
isPremium: true,
premium: {
features: ['advanced', 'priority']
},
basic: {
features: ['standard']
}
}
console.log(getConditionalValue(user, 'isPremium', 'premium.features', 'basic.features'))
// ['advanced', 'priority']
處理錯誤情況
typescript
import { get } from 'radash'
const data = {
user: null,
settings: undefined,
config: {
api: {
url: 'https://api.example.com'
}
}
}
console.log(get(data, 'user.name', 'No user')) // 'No user'
console.log(get(data, 'settings.theme', 'default')) // 'default'
console.log(get(data, 'config.api.url')) // 'https://api.example.com'
console.log(get(data, 'config.api.timeout', 5000)) // 5000
處理復雜嵌套
typescript
import { get } from 'radash'
const complexData = {
company: {
departments: [
{
name: 'Engineering',
teams: [
{
name: 'Frontend',
members: [
{ id: 1, name: 'Alice', skills: ['React', 'TypeScript'] },
{ id: 2, name: 'Bob', skills: ['Vue', 'JavaScript'] }
]
},
{
name: 'Backend',
members: [
{ id: 3, name: 'Charlie', skills: ['Node.js', 'Python'] }
]
}
]
}
]
}
}
console.log(get(complexData, 'company.departments.0.teams.0.members.0.name')) // 'Alice'
console.log(get(complexData, 'company.departments.0.teams.0.members.0.skills.0')) // 'React'
console.log(get(complexData, 'company.departments.0.teams.1.members.0.name')) // 'Charlie'
處理默認值類型
typescript
import { get } from 'radash'
const user = {
name: 'Alice',
preferences: {
theme: 'dark'
}
}
// 不同類型的默認值
console.log(get(user, 'age', 25)) // 25 (number)
console.log(get(user, 'email', '')) // '' (string)
console.log(get(user, 'isActive', true)) // true (boolean)
console.log(get(user, 'tags', [])) // [] (array)
console.log(get(user, 'settings', {})) // {} (object)
console.log(get(user, 'lastLogin', null)) // null
注意事項
- 路徑格式: 支持點分隔的字符串路徑或數組路徑
- 安全訪問: 不會拋出錯誤,總是返回默認值或undefined
- 性能: 對於深層嵌套對象,性能良好
- 類型安全: 提供完整的TypeScript類型支持
- 默認值: 當路徑不存在時返回指定的默認值
與其他方法的區別
obj?.prop
: 只支持單層屬性訪問lodash.get()
: 類似功能,但radash的get更輕量get()
: radash提供的安全屬性訪問方法
實際應用場景
- API響應處理: 安全訪問嵌套的API數據
- 配置管理: 訪問配置文件中的嵌套設置
- 表單處理: 處理復雜的表單數據結構
- 數據轉換: 安全地提取嵌套數據
- 錯誤處理: 避免訪問不存在的屬性時出錯