我有一个数字列表(任何长度),范围从0到100,包括重复。我需要将这些数字转换为100的部分。
例如: [25,50]变为[33.333,66.666]
[25,50,50]变为[20,40,40]
什么算法最适合这个?
答案 0 :(得分:1)
试试这个:
console.log(33.333 - 33.333 % 25); // 50
%是MODULO运算符。
Number.prototype.range = function(a) {
return this - this % a;
}
console.log((33.333).range(25)); // 25;
console.log((66.666).range(25)); // 50;
在数组中使用这样的地图:
console.log([33.333, 66.666].map(function(a) {
return a.range(25);
}));
答案 1 :(得分:1)
您需要计算数组中值的总和 - 然后您可以将数组中的每个值除以该总和,然后乘以100.
答案 2 :(得分:0)
这可以通过计算数组的总和然后将每个值除以该值来完成。可以使用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]
答案 3 :(得分:0)
解决此问题的最简单方法是对数组求和,将每个值作为该总和的一部分,然后乘以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;
}