将数组转换为累积百分比数组

4
我有这样一个数组:
[30, 10, 4, 3, 3]
我需要将其转换为一个累积百分比数组,使每个值都是到达该位置的所有值之和除以数组中所有值的总和。
在本例中,总数为50。因此,第一个值将是30/50,即0.6或60%。第二个值将为(30+10)/50,即0.8或80%,依此类推。
最终数组将是:
[60%, 80%, 88%, 94%, 100%]
如何使用JavaScript进行此转换?哪种方法最有效?

1
你尝试过什么? - Madhawa Priyashantha
4个回答

3

请尝试,

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

@asanas 很高兴能帮忙! :) - Rajaprabhu Aravindasamy
一遍又一遍地重新计算累积总和似乎不是很优雅。 - user663031
@torazaburo现在可以了吗?您能撤回对此的反对票吗?我喜欢您在答案中添加有价值的评论的态度。 - Rajaprabhu Aravindasamy
你好。这是一个关于有多挑剔的问题。不幸的是,我认为,恕我直言,这个答案仍然不完美。原因是它将所有数字加起来两次,一次是为了找到总数,另一次是为了计算百分比。在现实世界中,这并不重要,你的代码会通过审查并合并,我们会继续我们的生活。但是,如果有人想追求最佳解决方案,仍然有一种方法。基本问题是:如何在只加一次数字的情况下解决这个问题? - user663031

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
这将返回["60%", "20%", "8%", "6%", "6%"]。这不是OP所要求的。 - Rajaprabhu Aravindasamy
@RajaprabhuAravindasamy 不好意思,我已经更新了我的答案。 - Lewis

0

首先,您需要计算总和以获取分母(50)。然后,您需要对每个元素应用处理方法(new_value=value/denominator

为此,您可以使用简单的for循环,甚至使用数组特定函数更加简洁,以避免任何错误:

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

在JSFiddle上查看它的运行情况

编辑以添加累加器


0
将两个映射组合在一起,一个用于创建具有累积和的数组,另一个用于除以总和。
function cumulative_ratio(array) {
  var x = 0;
  return array . 
    map(v => x += v) .
    map(v => v / x);
}    

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接