You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript中交换对象指定属性值的优化方案 解决交换后undefined键问题

JavaScript交换对象特定属性取值优化方案

原方案问题

原实现没有提前判断属性是否存在,非必填字段缺失时会被强行赋值为undefined,后续删除逻辑属于事后补救,效率和可读性都较差。

优化实现

通用可复用工具函数

/**
 * 批量交换对象指定属性对的取值
 * @param {object} obj 目标操作对象
 * @param {Array} swapPairs 交换配置数组,每一项为 [属性名1, 属性名2, 父对象(可选,默认是obj本身)]
 * @returns {object} 修改后的原对象
 */
function swapObjectProperties(obj, swapPairs) {
  // 先缓存所有需要交换的属性原始值,避免赋值时互相覆盖
  const valueCache = new Map()
  swapPairs.forEach(([keyA, keyB, parent = obj]) => {
    // 仅当两个属性都实际存在于父对象中时,才纳入交换逻辑
    if (Object.hasOwn(parent, keyA) && Object.hasOwn(parent, keyB)) {
      valueCache.set([keyA, keyB, parent], [parent[keyA], parent[keyB]])
    }
  })
  // 批量执行赋值交换
  valueCache.forEach(([valA, valB], [keyA, keyB, parent]) => {
    parent[keyA] = valB
    parent[keyB] = valA
  })
  return obj
}

使用示例

const obj = {
  k1: 'v1',
  k2: 'v2',
  // 测试非必填场景:注释掉x1/x2也不会产生undefined属性
  // x1: 'v3',
  // x2: 'v4',
  y: {
    z1: 'v5',
    z2: 'v6'
  }
}

// 配置需要交换的属性对,嵌套属性传入对应的父对象即可
swapObjectProperties(obj, [
  ['k1', 'k2'],
  ['x1', 'x2'],
  ['z1', 'z2', obj.y]
])

console.log(obj)

方案优势

  • 无多余属性:仅当交换的两个属性都实际存在时才执行操作,不会产生undefined值,无需额外的属性删除逻辑
  • 无覆盖问题:提前缓存所有原始值,不会出现先后赋值导致的取值错误
  • 扩展性强:需要新增交换属性时仅需修改配置数组,无需修改核心逻辑
  • 支持嵌套:可灵活处理任意层级的嵌套对象属性交换

内容的提问来源于stack exchange,提问作者Tharunkumar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 01:09:05