求助:如何用JavaScript将数组嵌套元素转换为对象字段
解决方案
你可以通过遍历原数组,对每个对象做扁平化处理,把CField1数组里的嵌套字段展开为带编号后缀的平级属性。具体代码如下:
const originalData = [ {"Field1": "value11", "Field2":"value21", "CField1":[{"Id": 1, "Value":"myValue11", "Flag":"Y"}, {"Id": 2, "Value":"myValue12", "Flag":"n"}]}, {"Field1": "value21", "Field2":"value22", "CField1":[{"Id": 1, "Value":"myValue21", "Flag":"Y"}, {"Id": 2, "Value":"myValue22", "Flag":"n"}]} ]; const transformedData = originalData.map(item => { // 复制原对象中除CField1外的所有属性 const transformedItem = { ...item }; // 移除原对象里的嵌套数组字段 delete transformedItem.CField1; // 遍历嵌套数组,生成带编号的平级属性 item.CField1.forEach(subItem => { transformedItem[`Value${subItem.Id}`] = subItem.Value; transformedItem[`Flag${subItem.Id}`] = subItem.Flag; }); return transformedItem; }); console.log(JSON.stringify(transformedData, null, 2));
代码说明
- 外层数组遍历:用
Array.map()处理每个对象,直接生成新的转换后数组,比你找到的forEach更适合生成新数据集的场景。 - 基础属性复制:用扩展运算符
{ ...item }保留原对象的Field1、Field2等属性,避免直接修改原数据。 - 嵌套字段展开:遍历
CField1子项,根据子项的Id动态生成新键名(如Value1、Flag1),并赋值对应的值。 - 清理冗余字段:删除原对象中的
CField1,确保最终结果结构符合预期。
和你找到的代码的适配逻辑
你原来的代码核心是通过forEach给对象动态添加属性,我们把这个逻辑迁移到了嵌套数组的处理上——本质都是根据遍历项动态生成对象属性,只是需要先处理外层数组的每个对象,再遍历内层的嵌套数组完成字段展开。
运行代码后,输出结果与你期望的结构一致:
[ { "Field1": "value11", "Field2": "value21", "Value1": "myValue11", "Flag1": "Y", "Value2": "myValue12", "Flag2": "n" }, { "Field1": "value21", "Field2": "value22", "Value1": "myValue21", "Flag1": "Y", "Value2": "myValue22", "Flag2": "n" } ]
内容的提问来源于stack exchange,提问作者gt.guybrush
相关产品推荐
相关产品推荐

