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
相关产品推荐
相关产品推荐

