如何将数组内的对象拆分转换为指定结构的多对象数组?
数据结构转换问题
我有如下结构的对象数组:其中fixedValue是固定存在的,内层fixedValue数组的每个对象中category和total字段也固定,但"Col 2"、"Col 3"等为随机命名的字段,数量不固定,除category和total外的其他键名可能为任意随机字符串:
originalDataSet = [ { "fixedValue": [ { "category": "SD", "total": 2, "Col 2": 208, "Col 3": 88, "Col 4": 4, .... }, { "category": "EFG", "total": 1, "Col 2": 106, "Col 3": 46, "Col 4": 4, .... }, { "category": "ERG", "total": 1, "Col 2": 107, "Col 3": 47, "Col 4": 5, .... }, .... ] } ]
我的目标是将其转换为如下结构:
newDataSet = [{ fixedValue: [ { name: "SD", fixedValue: [ { name: "Col 2", value: 208 }, { name: "Col 3", value: 88 }, { name: "Col 4", value: 4 }, ... ] }, { name: "EFG", fixedValue: [ { name: "Col 2", value: 106 }, { name: "Col 3", value: 46 }, { name: "Col 4", value: 4 }, ... ] }, { name: "ERG", fixedValue: [ { name: "Col 2", value: 107 }, { name: "Col 3", value: 47 }, { name: "Col 4", value: 5 }, ... ] }, .... ]} ]
转换规则:将原数据中每个对象的category值作为新键name的值,将除category和total外的所有键值对转换为{name: 键名, value: 键值}的结构。
我目前写了如下代码,但感觉方向有误,请问如何实现目标结构newDataSet?
// First work with the array in originalDataSet.fixedValue const newObj = {}; // For each object in the fixedValue array for (const key of originalDataSet.fixedValue) { // If the key does not equal to 'category' or 'total' e.g., in this example we're referring to 'Col 2', 'Col 3', and 'Col 4', though there could be more. if(!key['category'] && !key['total']) // Should yield something like this: { name: "Col 2", value: 107 } newObj['name'] = key; newObj['value'] = newObj[key]; } } originalDataSet.fixedValue.foreach( newDataSet = [{ fixedValue: [ name: item.category fixedValue: [newObj] ] }] }
解决方案
你的代码存在循环逻辑错误(误将数组元素当成键遍历)、forEach拼写错误、对象语法缺失(缺少逗号与大括号),且复用同一个newObj会导致所有项引用同一对象的问题。可以用map方法结合对象遍历工具实现转换,逻辑更清晰:
const newDataSet = originalDataSet.map(outerItem => { // 转换内层fixedValue数组 const transformedFixedValue = outerItem.fixedValue.map(innerItem => { // 筛选并转换非category、total的键值对 const innerFixedValue = Object.entries(innerItem) .filter(([key]) => key !== 'category' && key !== 'total') .map(([name, value]) => ({ name, value })); return { name: innerItem.category, fixedValue: innerFixedValue }; }); return { fixedValue: transformedFixedValue }; });
代码说明:
- 外层
map遍历originalDataSet的每个元素(此处仅一个外层对象) - 内层
map遍历每个fixedValue中的对象:Object.entries将对象转为键值对数组,方便后续处理filter剔除category和total两个固定字段map将剩余键值对转换为{name: 键名, value: 键值}的目标格式- 返回包含
name(原category值)和fixedValue(转换后的数组)的对象
- 外层最终返回包含转换后
fixedValue的对象,组成最终的newDataSet
内容的提问来源于stack exchange,提问作者Beginner_Hello
相关产品推荐
相关产品推荐

