将数组转换为累积%数组

时间:2016-04-12 14:18:17

标签: javascript

我有一个像这样的数组:

[30, 10, 4, 3, 3]

我需要将其转换为累积%数组,使得每个值都是所有值之和除以数组中所有值的总和。

在这种情况下,总数为50.因此,第一个值为30/50, i.e., 0.6 or 60%. The 2nd value will be (30+10)/50, i.e., 0.8 or 80%,依此类推。

这里的最后一个数组是:

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

如何使用JavaScript进行此转换?最有效的方法是什么?

4 个答案:

答案 0 :(得分:2)

尝试,

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]

这看起来会更优雅,

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

答案 1 :(得分: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) + '%');

答案 2 :(得分:0)

首先需要计算总和以获得分母( 50 )。 然后,您需要对每个元素(new_value=value/denominator

应用处理

为此,您可以使用简单的for循环,甚至使用具有数组特定功能的 cleaner ,以避免任何错误:

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

已编辑以添加累加器

答案 3 :(得分:0)

组合两个地图,一个用于创建具有累积总和的数组,第二个用除以总和。

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