从下面的数组开始:
var arr = [{ "Year": 2019, "Title": "Sample1", "Sum": 1020000.0, "Budget":0},
{ "Year": 2019, "Title": "Sample2", "Sum": 2546658.0, "Budget":100},
{ "Year": 2019, "Title": "Sample3", "Sum": 1020000.0, "Budget":1000},
{ "Year": 2020, "Title": "Sample1", "Sum": 3472000.0, "Budget":100},
{ "Year": 2020, "Title": "Sample2", "Sum": 1020000.0, "Budget":10},
{ "Year": 2020, "Title": "Sample3", "Sum": 2452000.0, "Budget":50},
{ "Year": 2021, "Title": "Sample1", "Sum": 1000.0, "Budget":100},
{ "Year": 2021, "Title": "Sample2", "Sum": 119000.0, "Budget":10},
{ "Year": 2021, "Title": "Sample3", "Sum": 234000.0, "Budget":50}]
]
我需要将这个表格按照每年一行的方式进行转换,其中每个“Title”的数值都应该有一个对应的“Sum”值,并且预算值应该被汇总在一起,例如:
[{ "Year": 2019, "Sample1": 1020000.0, "Sample2":2546658.0, "Sample3":1020000.0 , "Budget":1100},{ etc]
我的平台不支持ES6,通过之前的帖子中的答案,我已经使用.reduce来实现大部分功能:
var res = arr.reduce(function(acc, curr) {
acc[curr.Year] = acc[curr.Year];
acc[curr.Year] = acc[curr.Year] || { Year: curr.Year } ;
acc[curr.Year][curr.Title] = curr.Sum;
return acc;
res = Object.keys(res).map(function(key) {
return res[key];
});
这将产生:
[{ "Year": 2019, "Sample1": 1020000.0, "Sample2":2546658.0, "Sample3":1020000.0 },
{ "Year": 2020, "Sample2": 3472000.0, "Sample2":1020000.0, "Sample3":2452000.0},
{ "Year": 2021, "Sample3": 1000.0, "Sample2":119000.0, "Sample3":234000.0}]
但我找不到一种方法来将预算数字相加,并将其添加到同一条目中。我怀疑需要在重复的数组上执行单独的reduce函数,并使用Year作为键,使用forEach循环将结果推入res数组中。有人能看到在同一个reduce函数中完成这个任务的方法吗?
Object.values(arr.reduce((a, { Year, Title, Sum, Budget }) => ({...a, [Year] : {...(a[Year] || {}), Year, [Title]: Sum, Budget: (a[Year] || {Budget: 0}).Budget + Budget}}), {}))
。 - Scott Sauyet