2016-04-17 1 views
3

私はおおよそ次のようになり、データ・セットがあります。ここで配列合計にアクセスするにはどうすればよいですか?

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値(シリーズの最後の1であることを起こる - 23 + 17 + 43) - の可能な限り最高の合計を知っておく必要がありますI私がしなければならないことは、まず配列マップを使って和を求め、その合計の最大値を取ることです。

私はconsole.log(d3.max(d3.map(d3.sum(dataset))));でこれを行うことができると思ったが、コンソールに表示されている内容はちょうどundefinedです。私の構文ははっきりと間違っています。第二項目に続いて、160の最大ではなく、最初の項目の合計と私に各シリーズ(Array [ 41, 81, 160 ])の合計を与える

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

私も近くである、これを試してみました(Array [ 37, 44, 53, 65, 83]) - 私は後者を探しています - 最大は83でなければなりません。

答えて

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 
0

私が得ることができるように、ここでは恐ろしい解決策があり、「ワンライナー」に近いです。それはあまりにも非でも長配列を処理します:

<!DOCTYPE html> 
 
<html> 
 

 
<head> 
 
    <script data-require="[email protected]" 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>


P.S.エリックのソリューションはずっと良いです...

関連する問題