如何将对象中Results数组的属性提取为原对象的数组属性?
修正对象属性重组的代码实现
需求回顾
需要将对象中Results数组内的所有属性提取到原对象中,将同属性的多个值合并为数组,最终移除Results属性。示例如下:
原始对象:
{ "Name": "John", "Results": [ { "Type": "DB", "Immediate_Action": "No" }, { "Type": "system", "Immediate_Action": "Yes" } ] }
转换后目标结构:
{ "Name": "John", "Type": ["DB","system"], "Immediate_Action": ["No","Yes"] }
现有代码问题分析
你的代码存在几个关键问题:
- 遍历
Results时,参数命名为key但实际是每个result对象,导致后续属性访问逻辑混乱 - 错误使用
entry.Results[key]访问属性值,正确方式应该直接从当前遍历的result对象取值 - 未移除原对象中的
Results属性 - 属性赋值逻辑对应错误,没有正确遍历每个
result的键值对
修正后的代码
const mapOscarResults = ({ data }) => { return data.map(entry => { // 解构entry,分离出Results和其他属性 const { Results, ...rest } = entry; const mapped = { ...rest }; // 遍历Results数组中的每个结果对象 Results.forEach(result => { // 遍历当前结果对象的所有键值对 Object.entries(result).forEach(([key, value]) => { // 初始化数组或追加值 if (mapped[key]) { mapped[key].push(value); } else { mapped[key] = [value]; } }); }); return mapped; }); };
代码解释
- 解构分离属性:使用对象解构把
entry中的Results和其他属性分开,避免后续操作影响原属性 - 初始化目标对象:基于其他属性创建
mapped对象,保留原对象除Results外的所有内容 - 遍历结果数组:逐个处理
Results中的每个对象 - 遍历键值对合并:对每个结果对象的键值对,将值追加到
mapped对应键的数组中,不存在则初始化数组 - 返回处理后的对象:最终返回的对象已完成属性重组,且移除了
Results
测试示例
假设传入的data为:
const testData = [ { "Name": "John", "Results": [ { "Type": "DB", "Immediate_Action": "No" }, { "Type": "system", "Immediate_Action": "Yes" } ] }, { "Name": "Alice", "Results": [ { "Type": "API", "Immediate_Action": "No" } ] } ];
调用mapOscarResults({ data: testData })会得到:
[ { Name: 'John', Type: [ 'DB', 'system' ], Immediate_Action: [ 'No', 'Yes' ] }, { Name: 'Alice', Type: [ 'API' ], Immediate_Action: [ 'No' ] } ]
内容的提问来源于stack exchange,提问作者Na el
相关产品推荐
相关产品推荐

