Skip to content

2822. 对象反转

2822. 对象反转

ts
var invertObject = function (obj) {
  const result = {}
  for (const [key, value] of Object.entries(obj)) {
    if (value in result) {
      if (Array.isArray(result[value])) {
        result[value].push(key) // 直接 push,避免创建新数组
      } else {
        result[value] = [result[value], key]
      }
    } else {
      result[value] = key
    }
  }
  return result
}

值冲突处理

反转对象时,多个 key 可能映射到同一个 value。这个实现的处理方式:

  • 第一个 key → value 直接存储为 result[value] = key
  • 第二个 key 遇到同一个 value → 转为数组 [firstKey, secondKey]
  • 后续更多 key → push 到数组中

这避免了数据丢失——所有原始 key 都被保留,不会静默覆盖。

注意:value in result 检查的是字符串化后的 value 作为 key 是否存在。因为对象的 key 只能是字符串,value 会被隐式转为字符串。{a: 1}{b: '1'} 在反向后会产生冲突——它们的 value 作为 key 时都是 '1'

数组判断的位置

Array.isArray(result[value]) 在 push 之前判断,而不是在创建数组时判断。这意味着:

js
invertObject({a: 1, b: 1, c: 1})
// → {1: ['a', 'b', 'c']}

每次遇到已存在的 value 时,检查它是否已经是数组。第一次冲突时创建数组 [prev, cur],后续冲突直接 push。如果用新数组覆盖([result[value], key]),会丢失之前的 key。