javascript - 如何对对象的值求和并将其放入数组中

标签 javascript arrays object d3.js

我有一个对象数组,它是动态的并且取决于表格行的选择。一个例子:

var obj = [
            { name: "test1",  totalCosts: 45560, actualTotalCosts: 652112, riskCosts: 65442 },
            { name: "test2",  totalCosts: 3434,  actualTotalCosts: 25252,   riskCosts: 34234 },
            { name: "test3",  totalCosts: 23123, actualTotalCosts: 23242,  riskCosts: 0 },
        ];

生成此数组后,我想调用一个函数,该函数将此数组中的另一行压入并将其命名为“total”并对所有相关值求和,如下所示:

{name: "total", totalCosts:72117, actualTotalCosts:700606 , risksCosts: 99676 }

obj[0].totalCosts + obj[1].totalCosts + obj[2].totalCosts = obj[3].totalCosts

我尝试用我有限的知识编写一个,但该函数不是将所有三个对象的值相加,而是将整个对象相加为一个。

            function sum1( obj ) {
            var result1 = [];
            for (var i = 0; i < obj.length; i++) {
                var sum = 0, arr = [];
                for (var key in obj[i]) {
                    if (key != 'name') {
                        sum += obj[i][key];
                        arr.push(sum[key]);
                    }

                }
                result1.push(arr);
                return result1;
            }
        }

请提供一个函数,该函数可以对所有对象求和并返回包含总计的数组。我也尝试使用 d3.sum 但没有成功。

最佳答案

您可以在 d3.sum 的帮助下采用函数式方法...

  obj.push(d3.keys(obj[0])                //get the keys from obj[0]
    .reduce(function(sumRow, sumCol) {    //construct a summary row
      var isNum = !isNaN(obj[0][sumCol])  //only sum numeric fields
      return (sumRow[sumCol] = (isNum ? d3.sum(obj, function(row) {
        return row[sumCol]                //accessor for the column for  d3.sum
      }) : "All"), sumRow)                //append the sum col to the sum row object
    },{}));                               //initial value for reduce is {}

工作示例

  (function() {
    var obj = [{
      name: "test1",
      name2: "type1",
      totalCosts: 45560,
      actualTotalCosts: 652112,
      riskCosts: 65442
    }, {
      name: "test2",
      name2: "type2",
      totalCosts: 3434,
      actualTotalCosts: 25252,
      riskCosts: 34234
    }, {
      name: "test3",
      name2: "type3",
      totalCosts: 23123,
      actualTotalCosts: 23242,
      riskCosts: 0
    }];

    obj.push(d3.keys(obj[0])
      .reduce(function(sumRow, sumCol) {
        var isNum = !isNaN(obj[0][sumCol])
        return (sumRow[sumCol] = (isNum ? d3.sum(obj, function(row) {
          return row[sumCol]
        }) : "All"), sumRow)
      }, {}));

    d3.select("#result").text(JSON.stringify(obj))
  })()
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>
<div id="result"></div>

关于javascript - 如何对对象的值求和并将其放入数组中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31420634/

相关文章:

javascript - V-for 迭代破坏了样式

javascript - 将结果存储在变量中,就像 Java 在 TypeScript 中一样

arrays - GLSL:OpenGL 缓冲区中的结构数组与数组结构

arrays - 需要为我的 CollectionView 获取字典中的数组计数

javascript - 如何在 ReactJS 中使用 filter() 从数组中删除一项 - 函数无法正常工作

javascript - JQuery 检测 Flash 对象上的悬停

javascript - RequestAnimationFrame 在 Safari 中不可用 - 如何制作流畅的动画?

arrays - 在 ruby​​ 中对数字和字符串数组进行排序的有效方法?

c++ - 在类对象的 vector 中找到一个值

javascript - 如何递归读取看起来像那样的对象