使用纯JavaScript基于映射替换数组对象属性的最优方案
如何基于映射表替换对象数组的属性键
给定一组除Id外属性动态的对象数组,需要根据映射表替换指定属性的键。示例如下:
// 示例对象数组 const records = [ {"Id": "0035w000036mj7oAAA", "Business Phone": "(212) 842-5501"}, {"Id": "0035w000036mj7oXXX", "Business Phone": "(212) 842-7777"} ]; // 属性替换映射表 const colHeaderToFieldApiName = {"Business Phone": "Phone"}; // 期望输出 const result = [ {"Id": "0035w000036mj7oAAA", "Phone": "(212) 842-5501"}, {"Id": "0035w000036mj7oXXX", "Phone": "(212) 842-7777"} ];
你当前的实现可以正常运行,但它会直接修改原数组中的对象。如果业务场景允许修改原数据,这个写法没问题,但多数场景下我们更倾向于生成新对象以避免副作用。下面提供几种更优的实现思路:
1. 生成新对象(无副作用,推荐)
使用map遍历数组,为每个对象重新构建键值对,原数组保持不变:
const transformedRecords = records.map(obj => { const newObj = {}; // 遍历原对象的所有自身属性 for (const [key, value] of Object.entries(obj)) { // 优先使用映射表中的新键,没有则保留原键 newObj[colHeaderToFieldApiName[key] || key] = value; } return newObj; });
这种方式的优势是不会修改原数据,避免意外的副作用,在复杂应用中更安全可靠。
2. 简化原地修改的写法
如果你确实需要原地修改原对象,可以简化代码(Object.entries只会遍历对象自身的可枚举属性,无需额外的hasOwnProperty检查):
records.forEach(obj => { for (const [key, value] of Object.entries(obj)) { const newKey = colHeaderToFieldApiName[key]; // 仅当存在有效新键且与原键不同时,执行替换 if (newKey && newKey !== key) { obj[newKey] = value; delete obj[key]; } } });
3. ES6+简洁写法(无副作用)
如果你的运行环境支持ES6+语法,可以用Object.fromEntries结合数组映射实现更简洁的转换:
const transformedRecords = records.map(obj => Object.fromEntries( Object.entries(obj).map(([key, value]) => [colHeaderToFieldApiName[key] || key, value] ) ) );
这种写法逻辑清晰、代码紧凑,但需要注意旧版浏览器的兼容性(如需兼容可通过Babel转译)。
内容的提问来源于stack exchange,提问作者Kevin Antonioli
相关产品推荐
相关产品推荐

