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

如何交换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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 21:48:03