2016-04-17 10 views
3

Ich habe einen Datensatz, der in etwa wie folgt aussieht:Wie greife ich hier auf die Array-Summe zu?

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 }] 
]; 

Und ich brauche die höchstmögliche Summe von Y-Werte kennen (es geschieht in der Serie die letzte zu sein - 23 + 17 + 43) - I Denken Sie, dass ich zuerst eine Array-Map verwenden muss, um die Summen zu finden, und dann das Maximum dieser Summen nehmen.

Ich dachte, ich könnte dies mit console.log(d3.max(d3.map(d3.sum(dataset)))); tun, aber was ich in der Konsole sehe, ist nur undefined - meine Syntax ist eindeutig falsch.

Ich habe auch versucht diese, die in der Nähe ist:

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

die mir die Summe jeder Reihe (Array [ 41, 81, 160 ]) mit einem Maximum von 160, nicht die Summe der ersten Punkte, gefolgt von den zweiten Elementen gibt (Array [ 37, 44, 53, 65, 83]) - Ich bin auf der Suche nach letzterem - das Maximum sollte 83 sein.

Antwort

2

d3.zip() ist hier praktisch, da Sie Daten auf Array-Index-Basis manipulieren.

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

Hier ist eine erschreckende Lösung und so nah an einem "One-Liner", wie ich bekommen kann. Es wird auch un-even Länge Arrays Griff:

<!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. Erics Lösung ist so viel besser ...

Verwandte Themen