将一段数字转换为100的一部分

Convert a range of numbers to portion of 100

本文关键字:转换 一部分 数字 一段      更新时间:2023-09-26

我有一个数字列表(任何长度),范围从0到100,包括重复项。我需要把这些数字转换成100的部分。

例如

:[25,50]变成[33.333,66.666]

[25,50,50]变成[20,40,40]

什么算法最适合这个?

您需要计算数组中值的总和-然后您可以将数组中的每个值除以该总和,然后乘以100。

试试这个:

console.log(33.333 - 33.333 % 25); // 50

%是模运算符。

Number.prototype.range = function(a) {
    return this - this % a;
}
console.log((33.333).range(25)); // 25;
console.log((66.666).range(25)); // 50;

在数组中使用map:

console.log([33.333, 66.666].map(function(a) {
    return a.range(25);
}));
演示

这可以通过计算数组的和,然后除以每个值来完成。它可以很容易地使用Array.reduce求和和Array.map来创建一个具有最终输出的新数组。下面是一个例子:

var arr1 = [25, 50];
var arr2 = [25, 50, 50];
function proportion(arr) {
  var sum = arr.reduce(function(prev, cur){
    return prev + cur;
  });
  var result = arr.map(function(val){
    return (val/sum)*100;
  });
  return result;
}

console.log(proportion(arr1)); // [33.33333333333333, 66.66666666666666]
console.log(proportion(arr2)); // [20, 40, 40]

JSBin here: http://jsbin.com/texuc/1/edit

解决这个问题的最简单方法是对数组求和,找到每个值作为该和的一个分数,然后乘以100。

这段代码应该能达到目的。

var inputArray = [25, 50, 50];
var outputArray = [];
var total = 0;
for (var i=0; i<(inputArray.length); i++) {
    total += inputArray[i];
}
for (var i=0; i<(inputArray.length); i++) {
    outputArray[i] = ((inputArray[i])/total) * 100;
}