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

如何在JavaScript中从已有对象生成键值反转去重的新对象

如何从已有JavaScript对象创建指定结构的新对象?

这是个很常见的键值反转+数组值拆分场景,我来给你梳理实现思路和完整代码:

实现思路

核心就是把原对象的「值」变成新对象的「键」,原对象的「键」变成新对象的「值」,还要处理两种特殊情况:

  • 原对象的值是数组时,要把数组里的每个元素都作为新键
  • 同一个新键对应多个原键时,要把这些原键收集到数组里,还要避免重复

完整代码实现

var test = { p1: [ 'factorial', '11' ], p3: 'temp1', x1: 'factorial' };
var newObj = {};

// 遍历原对象的每一组键值对
for (const [originalKey, originalValue] of Object.entries(test)) {
  // 把单个值统一转成数组,这样不管原value是数组还是单个值,都能统一处理
  const valuesToProcess = Array.isArray(originalValue) ? originalValue : [originalValue];
  
  valuesToProcess.forEach(newKey => {
    if (!newObj[newKey]) {
      // 如果新键还不存在,直接把原键赋值给它
      newObj[newKey] = originalKey;
    } else {
      // 新键已存在,分情况处理
      if (typeof newObj[newKey] === 'string') {
        // 当前是单个值,转成数组并加入新的原键
        newObj[newKey] = [newObj[newKey], originalKey];
      } else {
        // 已经是数组了,先检查原键是否已存在,避免重复添加
        if (!newObj[newKey].includes(originalKey)) {
          newObj[newKey].push(originalKey);
        }
      }
    }
  });
}

console.log(newObj);
// 输出结果正好符合你的需求:
// { factorial: [ 'p1', 'x1' ], '11': 'p1', temp1: 'p3' }

代码关键点说明

  • Object.entries(test):把原对象转换成键值对数组,方便用for...of遍历,比传统的for...in更简洁安全
  • 统一转数组:不管原value是单个值还是数组,都转成数组处理,减少代码分支,逻辑更清晰
  • 去重逻辑:用includes()检查数组里是否已经存在原键,避免重复添加(比如如果原对象有多个相同的键值对,不会重复存入)
  • 类型判断:当新键已存在时,判断当前存储的是字符串还是数组,动态转换结构,保证最终结果符合要求

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 10:17:17