如何将对象1的键应用到结构相同的对象2上并保留其值?
如何将一个对象的键映射到另一个结构相同的对象?
原始对象
const obj1 = { value1: 'Hello', value2: 'Goodbye', value3: ['yes', 'no'], value4: { value5: 'Phone' } } const obj2 = { v1: 'Orange', v2: 'Apple', v3: ['Cat', 'Dog'], v4: { v5: 'Basketball' } }
需求
已知两个对象的层级结构、键值对数量完全一致,仅键名不同。需要将obj1的键名替换obj2的键名,同时保留obj2的所有值,得到如下结果:
{ value1: 'Orange', value2: 'Apple', value3: ['Cat', 'Dog'], value4: { value5: 'Basketball' } }
解决方案
由于对象存在嵌套结构,需要用递归方式处理深层对象:
方法1:递归遍历转换
function remapKeys(keyTemplateObj, valueSourceObj) { const result = {}; const templateKeys = Object.keys(keyTemplateObj); const sourceKeys = Object.keys(valueSourceObj); templateKeys.forEach((templateKey, index) => { const templateVal = keyTemplateObj[templateKey]; const sourceVal = valueSourceObj[sourceKeys[index]]; // 处理嵌套对象(排除数组和null) if (typeof sourceVal === 'object' && sourceVal !== null && !Array.isArray(sourceVal)) { result[templateKey] = remapKeys(templateVal, sourceVal); } else { result[templateKey] = sourceVal; } }); return result; } // 调用函数 const newObj = remapKeys(obj1, obj2); console.log(newObj);
方法2:结合Object.entries与reduce实现
function remapKeys(keyTemplateObj, valueSourceObj) { return Object.entries(keyTemplateObj).reduce((acc, [templateKey, templateVal], index) => { const [_, sourceVal] = Object.entries(valueSourceObj)[index]; if (typeof sourceVal === 'object' && sourceVal !== null && !Array.isArray(sourceVal)) { acc[templateKey] = remapKeys(templateVal, sourceVal); } else { acc[templateKey] = sourceVal; } return acc; }, {}); } // 调用函数 const newObj = remapKeys(obj1, obj2); console.log(newObj);
说明
- 两个函数核心逻辑一致:按顺序匹配
obj1和obj2的键,将obj2的值赋值给obj1对应的键名 - 遇到嵌套对象时递归处理,确保深层结构的键也能被正确替换
- 数组会直接保留
obj2的数组内容,因为数组无需修改键名
内容的提问来源于stack exchange,提问作者Cemal Okten
相关产品推荐
相关产品推荐

