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

