Skip to content

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

注意事項

  1. 重復值: 如果有多個鍵對應相同的值,後面的鍵會覆蓋前面的鍵
  2. 值類型: 所有值都會被轉換為字符串作為新對象的鍵
  3. 對象值: 對象和數組值會被轉換為字符串表示
  4. 函數值: 函數值會被轉換為字符串表示
  5. 不可變性: 返回新對象,不修改原對象

與其他方法的區別

  • Object.keys(): 獲取對象的所有鍵
  • Object.values(): 獲取對象的所有值
  • Object.entries(): 獲取對象的鍵值對數組
  • invert(): 交換鍵和值的位置

實際應用場景

  1. 映射反轉: 將值到鍵的映射轉換為鍵到值的映射
  2. 查找表: 創建反向查找表
  3. 枚舉映射: 處理枚舉值的反向映射
  4. 配置轉換: 轉換配置對象的鍵值關系
  5. 數據轉換: 在數據處理中轉換鍵值結構

Released under the MIT License.