invert
將對象的鍵和值進行交換,創建新的對象。
基礎用法
typescript
import { invert } from 'radash'
const obj = { a: 1, b: 2, c: 3 }
const inverted = invert(obj)
console.log(inverted) // { '1': 'a', '2': 'b', '3': 'c' }
語法
typescript
function invert<T extends Record<string, any>>(obj: T): Record<string, string>
參數
obj
(T): 要反轉鍵值的對象
返回值
返回一個新的對象,原對象的鍵變為值,值變為鍵。
示例
基本鍵值交換
typescript
import { invert } from 'radash'
const obj = { name: 'Alice', age: 25, city: 'Beijing' }
const inverted = invert(obj)
console.log(inverted) // { 'Alice': 'name', '25': 'age', 'Beijing': 'city' }
處理重復值
typescript
import { invert } from 'radash'
const obj = { a: 1, b: 1, c: 2, d: 2 }
const inverted = invert(obj)
console.log(inverted) // { '1': 'b', '2': 'd' }
// 注意:重復的值會被後面的鍵覆蓋
處理不同類型的值
typescript
import { invert } from 'radash'
const obj = {
name: 'Alice',
age: 25,
isActive: true,
score: 95.5,
tags: ['admin', 'user']
}
const inverted = invert(obj)
console.log(inverted)
// {
// 'Alice': 'name',
// '25': 'age',
// 'true': 'isActive',
// '95.5': 'score',
// 'admin,user': 'tags'
// }
處理空值和undefined
typescript
import { invert } from 'radash'
const obj = {
name: 'Alice',
email: null,
phone: undefined,
address: ''
}
const inverted = invert(obj)
console.log(inverted)
// {
// 'Alice': 'name',
// 'null': 'email',
// 'undefined': 'phone',
// '': 'address'
// }
處理嵌套對象
typescript
import { invert } from 'radash'
const obj = {
user: { name: 'Alice' },
settings: { theme: 'dark' }
}
const inverted = invert(obj)
console.log(inverted)
// {
// '[object Object]': 'user',
// '[object Object]': 'settings'
// }
// 注意:對象值會被轉換為字符串
處理數組值
typescript
import { invert } from 'radash'
const obj = {
colors: ['red', 'blue', 'green'],
numbers: [1, 2, 3],
mixed: ['hello', 123, true]
}
const inverted = invert(obj)
console.log(inverted)
// {
// 'red,blue,green': 'colors',
// '1,2,3': 'numbers',
// 'hello,123,true': 'mixed'
// }
處理函數值
typescript
import { invert } from 'radash'
const obj = {
handler: () => 'hello',
validator: function() { return true },
processor: (x: number) => x * 2
}
const inverted = invert(obj)
console.log(inverted)
// {
// '() => \'hello\'': 'handler',
// 'function() { return true }': 'validator',
// '(x) => x * 2': 'processor'
// }
處理日期值
typescript
import { invert } from 'radash'
const obj = {
createdAt: new Date('2023-01-01'),
updatedAt: new Date('2023-12-31'),
birthday: new Date('1998-05-15')
}
const inverted = invert(obj)
console.log(inverted)
// {
// '2023-01-01T00:00:00.000Z': 'createdAt',
// '2023-12-31T00:00:00.000Z': 'updatedAt',
// '1998-05-15T00:00:00.000Z': 'birthday'
// }
處理布爾值
typescript
import { invert } from 'radash'
const obj = {
isActive: true,
isVerified: false,
isPremium: true,
isBlocked: false
}
const inverted = invert(obj)
console.log(inverted)
// {
// 'true': 'isPremium', // 注意:重復的true值被覆蓋
// 'false': 'isBlocked' // 重復的false值被覆蓋
// }
處理數字值
typescript
import { invert } from 'radash'
const obj = {
id: 1,
score: 95.5,
rating: 4.8,
count: 0,
price: -10.99
}
const inverted = invert(obj)
console.log(inverted)
// {
// '1': 'id',
// '95.5': 'score',
// '4.8': 'rating',
// '0': 'count',
// '-10.99': 'price'
// }
處理字符串值
typescript
import { invert } from 'radash'
const obj = {
firstName: 'Alice',
lastName: 'Smith',
email: 'alice@example.com',
phone: '+86-123-456-7890',
address: 'Beijing, China'
}
const inverted = invert(obj)
console.log(inverted)
// {
// 'Alice': 'firstName',
// 'Smith': 'lastName',
// 'alice@example.com': 'email',
// '+86-123-456-7890': 'phone',
// 'Beijing, China': 'address'
// }
處理特殊字符
typescript
import { invert } from 'radash'
const obj = {
message: 'Hello & Welcome!',
url: 'https://example.com?param=value',
path: '/api/users/123',
symbol: '@#$%^&*()'
}
const inverted = invert(obj)
console.log(inverted)
// {
// 'Hello & Welcome!': 'message',
// 'https://example.com?param=value': 'url',
// '/api/users/123': 'path',
// '@#$%^&*()': 'symbol'
// }
處理中文和Unicode
typescript
import { invert } from 'radash'
const obj = {
name: '張三',
city: '北京',
country: '中國',
emoji: '🌟🎉🎊'
}
const inverted = invert(obj)
console.log(inverted)
// {
// '張三': 'name',
// '北京': 'city',
// '中國': 'country',
// '🌟🎉🎊': 'emoji'
// }
處理配置映射
typescript
import { invert } from 'radash'
const statusMap = {
active: 'ACTIVE',
inactive: 'INACTIVE',
pending: 'PENDING',
suspended: 'SUSPENDED'
}
const inverted = invert(statusMap)
console.log(inverted)
// {
// 'ACTIVE': 'active',
// 'INACTIVE': 'inactive',
// 'PENDING': 'pending',
// 'SUSPENDED': 'suspended'
// }
處理錯誤代碼映射
typescript
import { invert } from 'radash'
const errorCodes = {
'VALIDATION_ERROR': 'E001',
'NOT_FOUND': 'E002',
'UNAUTHORIZED': 'E003',
'FORBIDDEN': 'E004',
'INTERNAL_ERROR': 'E005'
}
const inverted = invert(errorCodes)
console.log(inverted)
// {
// 'E001': 'VALIDATION_ERROR',
// 'E002': 'NOT_FOUND',
// 'E003': 'UNAUTHORIZED',
// 'E004': 'FORBIDDEN',
// 'E005': 'INTERNAL_ERROR'
// }
處理HTTP狀態碼
typescript
import { invert } from 'radash'
const httpStatus = {
OK: 200,
CREATED: 201,
BAD_REQUEST: 400,
UNAUTHORIZED: 401,
NOT_FOUND: 404,
INTERNAL_SERVER_ERROR: 500
}
const inverted = invert(httpStatus)
console.log(inverted)
// {
// '200': 'OK',
// '201': 'CREATED',
// '400': 'BAD_REQUEST',
// '401': 'UNAUTHORIZED',
// '404': 'NOT_FOUND',
// '500': 'INTERNAL_SERVER_ERROR'
// }
處理顏色映射
typescript
import { invert } from 'radash'
const colorMap = {
red: '#FF0000',
green: '#00FF00',
blue: '#0000FF',
yellow: '#FFFF00',
purple: '#800080'
}
const inverted = invert(colorMap)
console.log(inverted)
// {
// '#FF0000': 'red',
// '#00FF00': 'green',
// '#0000FF': 'blue',
// '#FFFF00': 'yellow',
// '#800080': 'purple'
// }
處理語言映射
typescript
import { invert } from 'radash'
const languageMap = {
'en': 'English',
'zh': '中文',
'es': 'Español',
'fr': 'Français',
'de': 'Deutsch'
}
const inverted = invert(languageMap)
console.log(inverted)
// {
// 'English': 'en',
// '中文': 'zh',
// 'Español': 'es',
// 'Français': 'fr',
// 'Deutsch': 'de'
// }
處理用戶角色映射
typescript
import { invert } from 'radash'
const roleMap = {
admin: 'Administrator',
user: 'Regular User',
guest: 'Guest User',
moderator: 'Moderator',
editor: 'Content Editor'
}
const inverted = invert(roleMap)
console.log(inverted)
// {
// 'Administrator': 'admin',
// 'Regular User': 'user',
// 'Guest User': 'guest',
// 'Moderator': 'moderator',
// 'Content Editor': 'editor'
// }
處理文件類型映射
typescript
import { invert } from 'radash'
const fileTypes = {
'.js': 'JavaScript',
'.ts': 'TypeScript',
'.json': 'JSON',
'.md': 'Markdown',
'.html': 'HTML',
'.css': 'CSS'
}
const inverted = invert(fileTypes)
console.log(inverted)
// {
// 'JavaScript': '.js',
// 'TypeScript': '.ts',
// 'JSON': '.json',
// 'Markdown': '.md',
// 'HTML': '.html',
// 'CSS': '.css'
// }
處理空對象和邊界情況
typescript
import { invert } from 'radash'
// 空對象
console.log(invert({})) // {}
// 只有一個鍵值對
console.log(invert({ key: 'value' })) // { 'value': 'key' }
// 所有值都相同
console.log(invert({ a: 1, b: 1, c: 1 })) // { '1': 'c' }
// 所有鍵都相同(這種情況不會發生,因為對象鍵必須唯一)
console.log(invert({ a: 1, a: 2 })) // { '2': 'a' }
處理復雜映射場景
typescript
import { invert } from 'radash'
const complexMap = {
'user.profile.name': 'displayName',
'user.profile.email': 'emailAddress',
'user.settings.theme': 'preferredTheme',
'user.settings.language': 'preferredLanguage',
'user.permissions.admin': 'isAdmin',
'user.permissions.moderator': 'isModerator'
}
const inverted = invert(complexMap)
console.log(inverted)
// {
// 'displayName': 'user.profile.name',
// 'emailAddress': 'user.profile.email',
// 'preferredTheme': 'user.settings.theme',
// 'preferredLanguage': 'user.settings.language',
// 'isAdmin': 'user.permissions.admin',
// 'isModerator': 'user.permissions.moderator'
// }
注意事項
- 重復值: 如果有多個鍵對應相同的值,後面的鍵會覆蓋前面的鍵
- 值類型: 所有值都會被轉換為字符串作為新對象的鍵
- 對象值: 對象和數組值會被轉換為字符串表示
- 函數值: 函數值會被轉換為字符串表示
- 不可變性: 返回新對象,不修改原對象
與其他方法的區別
Object.keys()
: 獲取對象的所有鍵Object.values()
: 獲取對象的所有值Object.entries()
: 獲取對象的鍵值對數組invert()
: 交換鍵和值的位置
實際應用場景
- 映射反轉: 將值到鍵的映射轉換為鍵到值的映射
- 查找表: 創建反向查找表
- 枚舉映射: 處理枚舉值的反向映射
- 配置轉換: 轉換配置對象的鍵值關系
- 數據轉換: 在數據處理中轉換鍵值結構