繁体   English   中英

减少和求和对象条目数组

[英]reduce & sum array of objects entries

从以下数组:

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}]
]

我需要将此更改为每行一年,如果每个“标题”的值都有一个带有“总和”值的条目,则预算值应该汇总在一起,即。

[{ "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函数中看到这样做的方法吗?

reduce回调中初始化Year对象时,还要将Budget属性初始化为0.然后,在该年的每次迭代中,除了设置Sample属性外,还要添加到budget属性:

 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} ] var res = arr.reduce(function(acc, curr) { acc[curr.Year] = acc[curr.Year] || { Year: curr.Year, Budget: 0 } ; // ^^^^^^^^^ acc[curr.Year][curr.Title] = curr.Sum; acc[curr.Year].Budget += curr.Budget; // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ return acc; }, {}); var output = Object.keys(res).map(function(key) { return res[key]; }); console.log(output); 

请注意原始代码中的行

acc[curr.Year] = acc[curr.Year];

根本没有完成任何事情 - 你可以完全省略它。

你可以考虑使用Babel和polyfill,允许你用最新和最好的语言版本编写代码,同时保留过时浏览器的兼容性,在这种情况下,代码可以被美化为:

 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}] const output = Object.values(arr.reduce((a, { Year, Title, Sum, Budget }) => { a[Year] = a[Year] || { Year, Budget: 0 }; a[Year][Title] = Sum; a[Year].Budget += Budget; return a; }, {})); console.log(output); 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM