如何批量修改JavaScript对象数组中的多个属性名?
问题描述
现有如下对象结构:
let myObj = { "Accounts": [ { "Type": "Card", "CreditCard": {} }, { "Type": "ACH", "CreditCard": {} }, { "Type": "CDA", "Checking": {} }, { "Type": "INTL", "Mortgage": {} } ] }
需要将CreditCard、Checking、Mortgage等约20个不同属性名统一修改为FinanceRecord。目前只能逐个指定属性名修改,示例如下:
let temp = myObj.map(({ CreditCard: FinanceRecord, ...item }) => ({ FinanceRecord, ...item, })); // 逐个指定属性名... myObj.map(({ Checking: FinanceRecord, ...item }) => ({ FinanceRecord, ...item, }));
期望输出:
let myObj = { "Accounts": [ { "Type": "Card", "FinanceRecord": {} }, { "Type": "ACH", "FinanceRecord": {} }, { "Type": "CDA", "FinanceRecord": {} }, { "Type": "INTL", "FinanceRecord": {} } ] }
高效实现方案
无需逐个手动指定属性名,以下几种方案可以高效完成批量重命名:
方案1:自动识别非Type属性
如果每个账户对象仅包含Type和目标属性两个字段,直接过滤出非Type的属性即可:
myObj.Accounts = myObj.Accounts.map(account => { const targetKey = Object.keys(account).find(key => key !== 'Type'); return { Type: account.Type, FinanceRecord: account[targetKey] }; });
方案2:精准匹配目标属性列表
如果存在额外属性,或需要明确指定要替换的属性集合,先定义属性列表再批量处理:
// 列出所有需要替换的属性名 const targetProps = ['CreditCard', 'Checking', 'Mortgage', /* 补充剩余17个属性 */]; myObj.Accounts = myObj.Accounts.map(account => { const result = { Type: account.Type }; // 找到当前对象中匹配的目标属性 const matchedProp = targetProps.find(prop => prop in account); if (matchedProp) { result.FinanceRecord = account[matchedProp]; } // 保留其他非目标属性(如果需要) Object.keys(account).forEach(key => { if (key !== 'Type' && key !== matchedProp) { result[key] = account[key]; } }); return result; });
方案3:解构+动态赋值(简洁版)
利用对象解构和剩余属性,快速提取目标值:
myObj.Accounts = myObj.Accounts.map(({ Type, ...rest }) => { const [_, financeData] = Object.entries(rest)[0]; return { Type, FinanceRecord: financeData }; });
内容的提问来源于stack exchange,提问作者Shaggy
相关产品推荐
相关产品推荐

