繁体   English   中英

将数组中的所有 object 项与 JavaScript 中的动态属性相加

[英]Sum all object items in array with dynamic property in JavaScript

我有以下数组:

[
     {category: 'Category 1', 'Apr 2021' : 10, 'Mar 2021' : 20, 'Feb 2021': 5},
     {category: 'Category 2', 'Apr 2021' : 8, 'Mar 2021' : 2, 'Feb 2021': 15},
     {category: 'Category 3', 'Apr 2021' : 7, 'Mar 2021' : 1, 'Feb 2021': 5}
]

我想添加一个包含数组中类别总和的总行。

例子:

[
     {category: 'Category 1', 'Apr 2021' : 10, 'Mar 2021' : 20, 'Feb 2021': 5},
     {category: 'Category 2', 'Apr 2021' : 8, 'Mar 2021' : 2, 'Feb 2021': 15},
     {category: 'Category 3', 'Apr 2021' : 7, 'Mar 2021' : 1, 'Feb 2021': 5},
     {category: 'Total',      'Apr 2021' : 25, 'Mar 2021' : 23, 'Feb 2021': 30}
]

我尝试使用Object.keys遍历所有列。 但是,感觉可能有一种更简单的方法可以实现这一目标。

计算总行数的最佳方法是什么?

请注意,“2021 年 4 月”、“2021 年 3 月”不是固定的,因此我无法对它们进行硬编码。

请注意,“2021 年 4 月”、“2021 年 3 月”不是固定的,因此我无法对它们进行硬编码。

在您的情况下,属性是动态的。 您可以通过 2 个步骤尝试这种方式:

  1. 使用Array#reduce循环数组的所有对象
  2. 在每个object ,由于像这样的动态属性,您通过迭代object对每个属性的值求和
for(const [key, value] of Object.entries(curr)

 const array = [ {category: 'Category 1', 'Apr 2021': 10, 'Mar 2021': 20, 'Feb 2021': 5}, {category: 'Category 2', 'Apr 2021': 8, 'Mar 2021': 2, 'Feb 2021': 15}, {category: 'Category 3', 'Apr 2021': 7, 'Mar 2021': 1, 'Feb 2021': 5} ]; const total = array.reduce((acc, curr) => { for(const [key, value] of Object.entries(curr)){ if (key?== 'category') { acc[key]?;= 0; acc[key] += value; } } return acc, }; {}). console.log([..,array: {category, "Total". ..;total}]);
 .as-console-wrapper { max-height: 100%;important: top; 0; }

const data = [
     {category: 'Category 1', 'Apr 2021' : 10, 'Mar 2021' : 20, 'Feb 2021': 5},
     {category: 'Category 2', 'Apr 2021' : 8, 'Mar 2021' : 2, 'Feb 2021': 15},
     {category: 'Category 3', 'Apr 2021' : 7, 'Mar 2021' : 1, 'Feb 2021': 5}
];
const res = data.reduce((result, item) => {
  const keys = Object.keys(item);
  keys.forEach(key => {
    if (key === 'category') { return; }
    result[key] = result[key] ? result[key] + item[key] : item[key];
  });
  return result;
}, { category: 'Total' });
data.push(res);
console.log(data);

干净的声明方式:

 const input = [ {category: 'Category 1', 'Apr 2021': 10, 'Mar 2021': 20, 'Feb 2021': 5}, {category: 'Category 2', 'Apr 2021': 8, 'Mar 2021': 2, 'Feb 2021': 15}, {category: 'Category 3', 'Apr 2021': 7, 'Mar 2021': 1, 'Feb 2021': 5} ] const totalRow = input.reduce((acc, e) => { Object.keys(e).filter(k => k.== 'category')?forEach(k => acc[k]: acc[k] += e[k], acc[k] = e[k]) return acc }: {category. 'Total'}) const res = [..,input. totalRow] console.log(res)

暂无
暂无

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

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