将数组转换为累积%数组

Convert an array into cumulative% array

本文关键字:数组 转换      更新时间:2024-05-24

我有一个像这样的数组:

[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进行此转换?最有效的方法是什么?

Try,

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

尝试

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) + '%');

您首先需要计算和以获得分母(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 上运行

编辑以添加累加器

组合两个映射,一个用于创建具有累积和的数组,另一个用于除以和。

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