2016-04-12 13 views
4

Ich habe ein Array wie diese:ein Array in kumulativer% Array

[30, 10, 4, 3, 3]

Und ich brauche dies in einer solchen Art und Weise zu einer kumulativen% Array zu transformieren, dass jeder Wert ist die Summe aller Werte bis dort dividiert durch die Summe aller Werte im Array.

In diesem Fall ist die Summe 50. Also wird der erste Wert 30/50, i.e., 0.6 or 60%. The 2nd value will be (30+10)/50, i.e., 0.8 or 80% und so weiter sein.

wird die endgültige Anordnung in dieser sein:

[60%, 80%, 88%, 94%, 100%]

Wie kann ich diese Transformation mit JavaScript zu tun? Was wäre der effizienteste Weg?

+1

Was haben Sie versucht? –

Antwort

2

Versuchen Versuchen,

var x = [30, 10, 4, 3, 3]; 
var y = x.reduce(function(a,b){ return a+b; }, 0) 
x = x.map(function(itm, index){ 
    for(var i=0;i<index;i++) itm += x[i]; 
    return (itm/y * 100); 
}); 

x; //[60, 80, 88, 94, 100] 

Und das aussehen wird elegant,

var x = [30, 10, 4, 3, 3]; 
var y = x.reduce(function(a,b){ return a+b; }, 0), sum = 0; 
x = x.map(function(itm) { return sum += itm, (sum/y) * 100; }); 
+0

Danke. Das funktioniert für mich :) – asanas

+0

@asanas Froh, zu helfen! :) –

+0

Die kumulativen Summen immer wieder neu zu berechnen erscheint nicht sehr elegant. –

1

let nums = [30, 10, 4, 3, 3]; 
let sum = nums.reduce((prev,curr) => prev + curr); 
let result = nums.map((num,i) => Math.round(nums.slice(0,i + 1).reduce((prev,curr) => prev + curr)/sum * 100) + '%'); 
+1

Dies wird '[" 60% "," 20% "," 8% "," 6% "," 6% "] zurückgeben. Dies ist nicht OP verlangt haben. –

+0

@RajaprabhuAravindasamy Mein schlechtes. Ich habe meine Antwort aktualisiert. – Lewis

0

Als erstes müssen Sie die Summe bekommen den Nenner berechnen (). Dann müssen Sie die Behandlung für jedes Element anzuwenden (new_value=value/denominator)

ToDo so können Sie für Schleifen einfach verwenden, oder sogar Reiniger mit Arrays spezifischen Funktionen, jeden Fehler zu vermeiden:

var array = [30, 10, 4, 3, 3]; 

// Compute the denominator 
var sum = array.reduce(function(pv, cv) { return pv + cv; }, 0); 
// Duplicate the array 
var arrayResult = array; 
// Apply the function to each given "myArray[ind]" element 
arrayResult.forEach(function(cv,ind,myArray) { 
    myArray[ind] = cv/sum; 
    // Add the previous accumulator if any 
    if(ind>0) {myArray[ind] += myArray[ind-1];} 
}); 

See it running on JSFiddle

editierten den Speicher hinzufügen

0

zwei Combine Karten, eine, um ein Array mit kumulativen Summen zu erstellen, die zweite durch die Summe zu teilen.

function cumulative_ratio(array) { 
    var x = 0; 
    return array . 
    map(v => x += v) . 
    map(v => v/x); 
}