如何在此处访问数组总和?

时间:2016-04-17 23:31:02

标签: arrays d3.js

我的数据集大致如下:

var dataset = [
  // apples
  [{"x": 1, "y": 5 }, { "x": 2, "y": 4 }, { "x": 3, "y": 2 }, { "x": 4, "y": 7 }, { "x": 5, "y": 23 }],
  // oranges
  [{ "x": 1, "y": 10 }, { "x": 2, "y": 12 }, { "x": 3, "y": 19 }, { "x": 4, "y": 23 }, { "x": 5, "y": 17 }],
  // grapes
  [{ "x": 1, "y": 22 }, { "x": 2, "y": 28 }, { "x": 3, "y": 32 }, { "x": 4, "y": 35 }, { "x": 5, "y": 43 }]
];

我需要知道最高可能的Y值之和(恰好是系列中的最后一个 - 23 + 17 + 43) - 我认为我需要做的是首先使用数组映射找到总和,然后取这些总和的最大值。

我认为我可以使用console.log(d3.max(d3.map(d3.sum(dataset))));执行此操作,但我在控制台中看到的只是undefined - 我的语法显然是错误的。

我也试过这个,这很接近:

dataset.map(function (a) {
  return d3.sum(a.map(function (d) { return d.y; }));
})

其中给出了每个系列的总和(Array [ 41, 81, 160 ]),最大为160,而不是第一项的总和,后跟第二项(Array [ 37, 44, 53, 65, 83]) - 我正在寻找后者 - 最大值应为83

2 个答案:

答案 0 :(得分:2)

d3.zip()在这里派上用场,因为你正在根据数组索引操作数据。

https://jsfiddle.net/guanzo/o8voyydx/2/

var result = dataset.map(d=>d.map(d=>d.y))
result = d3.zip.apply(undefined,result)
result = d3.max(result.map(d=>d3.sum(d)))
console.log(result )//83

答案 1 :(得分:0)

这是一个可怕的解决方案,并且接近一个" one-liner"我可以得到。它也会处理非偶数长度数组:



<!DOCTYPE html>
<html>

<head>
  <script data-require="d3@3.5.3" data-semver="3.5.3" src="//cdnjs.cloudflare.com/ajax/libs/d3/3.5.3/d3.js"></script>
</head>

<body>
  <script>
    var dataset = [
      // apples
      [{
        "x": 1,
        "y": 5
      }, {
        "x": 2,
        "y": 4
      }, {
        "x": 3,
        "y": 2
      }, {
        "x": 4,
        "y": 7
      }, {
        "x": 5,
        "y": 23
      }],
      // oranges
      [{
        "x": 1,
        "y": 10
      }, {
        "x": 2,
        "y": 12
      }, {
        "x": 3,
        "y": 19
      }, {
        "x": 4,
        "y": 23
      }, {
        "x": 5,
        "y": 17
      }],
      // grapes
      [{
        "x": 1,
        "y": 22
      }, {
        "x": 2,
        "y": 28
      }, {
        "x": 3,
        "y": 32
      }, {
        "x": 4,
        "y": 35
      }, {
        "x": 5,
        "y": 43
      }]
    ];
  
   var l = d3.max(dataset, function(d){
     return d.length;
   }), 
   sumArr = d3.range(l).map(function(i){
     return dataset.map(function(d){
       return d[i] ? d[i].y : 0;
     });
   }).map(function(d){
     return d3.sum(d);
   });
   
  d3.select("body").text(sumArr);
    
  </script>
</body>

</html>
&#13;
&#13;
&#13;

P.S。 Eric的解决方案要好得多......