如何交换JS对象的键值对并删除原有属性避免键数量翻倍?
问题原因
现有代码仅向原对象新增了交换后的键值对,没有删除原有键,因此最终属性数量翻倍。同时如果直接在原对象上操作,建议提前缓存原键列表,避免后续新增的键干扰遍历逻辑。
解决方案
方案1:生成新对象(推荐,无副作用)
直接基于原对象的键值对生成交换后的新对象,不会修改原对象,写法简洁易维护:
const product = { id: "FRT34495", price: 34.56, nr: 34456, }; const change = (obj) => { // 遍历键值对,反转每组键值后生成新对象 return Object.fromEntries( Object.entries(obj).map(([key, value]) => [value, key]) ); }; console.log(change(product)); // 输出:{ FRT34495: 'id', '34.56': 'price', '34456': 'nr' }
如果需要兼容ES2019之前的环境,可以用普通循环实现:
const change = (obj) => { const res = {}; for (const key in obj) { // 过滤原型链上的属性 if (obj.hasOwnProperty(key)) { res[obj[key]] = key; } } return res; };
注意:如果原对象存在重复值,交换后后出现的键会覆盖先出现的,因为对象的键具有唯一性。
方案2:直接修改原对象
如果业务要求必须修改原对象而不是返回新对象,可以提前缓存原键列表,添加新键值对后删除所有原有键:
const product = { id: "FRT34495", price: 34.56, nr: 34456, }; const change = () => { // 提前缓存所有原有键,避免后续新增键干扰遍历 const oldKeys = Object.keys(product); for (const key of oldKeys) { const value = product[key]; product[value] = key; // 删除原有属性 delete product[key]; } return product; }; console.log(change(product)); // 输出:{ FRT34495: 'id', '34.56': 'price', '34456': 'nr' }
内容的提问来源于stack exchange,提问作者rigan
相关产品推荐
相关产品推荐

