我的数据集大致如下:
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
。
答案 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;
P.S。 Eric的解决方案要好得多......