javascript - 减少和求和对象数组的条目

标签 javascript arrays reduce

来自以下数组:

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 和 polyfills,允许您使用最新最好版本的语言编写代码,同时保留对过时浏览器的兼容性,在这种情况下,代码可以美化为:

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);

关于javascript - 减少和求和对象数组的条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56436225/

相关文章:

javascript - Amcharts 图表 - 图表列到自定义 URL 的超链接以在新选项卡/窗口中打开

javascript - 单击时不适用于动态添加的链接 ID 属性

javascript - 灯箱将图像移动到右下角

javascript - 如何在 Jquery 中迭代 JSON 数组

java - 从用户输入中读取泛型类型

javascript - Typescript reducer 的 switch case typeguard 不适用于对象传播

javascript - AngularJS 和 PHP 未定义属性 : stdClass

php - 如何通过循环查询结果来制作数组数组

javascript - JS : Reorganize objects inside an array based on value of a particular key (reduce?)

javascript - 根据条件求和列制表符