使用JavaScript将指定XML结构数据转换为目标对象数组
问题
需要将如下格式的responseData数组转换为指定结构的对象数组,其中日期需从'29 Nov 2022'格式转换为'22/11/22'格式。
原始数据:
let responseData = [ { type: 'element', name: 'ns2:VehicleInfo', elements: [ { type: 'element', name: 'ns2:price', elements: [ { type: 'text', text: '123', }, ], }, { type: 'element', name: 'ns2:model', elements: [ { type: 'text', text: 'vento', }, ], }, { type: 'element', name: 'ns2:brand', elements: [ { type: 'text', text: 'Vw', }, ], }, { type: 'element', name: 'ns2:date', elements: [ { type: 'text', text: '29 Nov 2022', }, ], }, { type: 'element', name: 'ns2:vin', elements: [ { type: 'text', text: '1', }, ], }, ], }, { type: 'element', name: 'ns2:VehicleInfo', elements: [ { type: 'element', name: 'ns2:price', elements: [ { type: 'text', text: '10012', }, ], }, { type: 'element', name: 'ns2:model', elements: [ { type: 'text', text: '4matic', }, ], }, { type: 'element', name: 'ns2:brand', elements: [ { type: 'text', text: 'BMW', }, ], }, { type: 'element', name: 'ns2:date', elements: [ { type: 'text', text: '29 Nov 2022', }, ], }, { type: 'element', name: 'ns2:vin', elements: [ { type: 'text', text: '2', }, ], }, ], }, ]
目标结构示例:
let obj = [ { id: '1', vin: '1', brand: 'Vw', model: 'vento', date: '22/11/22', price: '123', }, { id: '2', vin: '2', brand: 'BMW', model: '4matic', date: '22/11/22', price: '10012', }, { id: '3', vin: '3', brand: 'TATA', model: 'Nano', date: '22/11/22', price: '$10000', }, ];
解决方案
实现思路
- 遍历
responseData中的每个车辆信息对象,提取内部elements数组中的字段值; - 针对日期字段,编写转换函数将
'DD MMM YYYY'格式转为'YY/MM/DD'格式; - 为每个转换后的对象添加
id字段,值与vin保持一致。
代码实现
// 日期转换函数:将'29 Nov 2022'转为'22/11/22' function formatDate(dateStr) { const monthMap = { Jan: '01', Feb: '02', Mar: '03', Apr: '04', May: '05', Jun: '06', Jul: '07', Aug: '08', Sep: '09', Oct: '10', Nov: '11', Dec: '12' }; const [day, month, year] = dateStr.split(' '); // 截取年份后两位,拼接成目标格式 return `${year.slice(-2)}/${monthMap[month]}/${day}`; } // 转换数据 const transformedData = responseData.map(item => { // 从elements中提取各字段值 const getFieldValue = fieldName => { const field = item.elements.find(el => el.name === `ns2:${fieldName}`); return field?.elements[0]?.text || ''; }; return { id: getFieldValue('vin'), vin: getFieldValue('vin'), brand: getFieldValue('brand'), model: getFieldValue('model'), date: formatDate(getFieldValue('date')), price: getFieldValue('price') }; }); console.log(transformedData);
代码说明
formatDate函数:通过月份映射表将英文月份缩写转为两位数字,再截取年份后两位,拼接成目标日期格式;getFieldValue函数:封装了从elements数组中查找指定字段并提取文本值的逻辑,简化代码;map方法:遍历原始数组,逐个转换为目标结构的对象,最终得到转换后的数组。
内容的提问来源于stack exchange,提问作者Akshaykumar Mande
相关产品推荐
相关产品推荐

