如何将分类值转为列名?JavaScript字典列表格式转换求助
1. 如何将分类值转换为列名?
这个操作通常叫做**数据透视(Pivot)**或者“宽表转换”,核心是把分类字段的不同取值拆成独立列,再把对应的值聚合到同一行里。通用思路分四步:
- 确定分组依据:比如你案例里的
Year,用来判断哪些数据属于同一行 - 确定分类列:就是要转成新列名的字段(比如
category) - 确定值列:要填充到新列里的数据(比如
expenditure) - 按分组依据聚合:把每个分类对应的取值映射到新创建的列中
2. JavaScript字典列表的透视转换实现
针对你给出的具体数据,我用JavaScript的reduce方法来实现转换,新手也能快速上手:
先把你的原始数据列出来:
const rawData = [ {Year: "2007", expenditure: "314,448.7", category: "Exports"}, {Year: "2008", expenditure: "320,805.2", category: "Exports"}, {Year: "2007", expenditure: "314,448.7", category: "Imports"}, {Year: "2008", expenditure: "320,805.2", category: "Imports"} ];
接下来是转换代码:
// 用reduce进行分组和透视 const transformedData = Object.values(rawData.reduce((result, currentItem) => { // 以Year作为分组的唯一标识 const yearKey = currentItem.Year; // 如果当前年份还没在结果对象里,先初始化一个包含Year的基础对象 if (!result[yearKey]) { result[yearKey] = { Year: yearKey }; } // 把category作为新列名,expenditure作为对应值 // 要是需要把支出转成数字(去掉千分位逗号),可以用下面这行替换: // result[yearKey][currentItem.category] = parseFloat(currentItem.expenditure.replace(/,/g, '')); result[yearKey][currentItem.category] = currentItem.expenditure; return result; }, {})); // 打印结果看看 console.log(transformedData);
运行后你会得到想要的结果:
[ { Year: "2007", Exports: "314,448.7", Imports: "314,448.7" }, { Year: "2008", Exports: "320,805.2", Imports: "320,805.2" } ]
小补充:
如果数据里出现同一年份同一分类有多条记录的情况,上面的代码会默认保留最后一条的值。要是你需要求和/取平均值之类的聚合操作,只需要调整赋值逻辑,比如:
// 对同分类的支出求和 const numericValue = parseFloat(currentItem.expenditure.replace(/,/g, '')); if (result[yearKey][currentItem.category]) { result[yearKey][currentItem.category] += numericValue; } else { result[yearKey][currentItem.category] = numericValue; }
内容的提问来源于stack exchange,提问作者Michael Ro
相关产品推荐
相关产品推荐

