我有一个填充了正int值的数组,我怎样才能将此列表标准化,以便最大值始终为100?提前谢谢!
答案 0 :(得分:24)
我们的想法是首先找到数组中的最大数字(使用apply
上的Math.max
),然后找到最高数字与100之间的比率。
在此之后,只需循环遍历您的阵列并将所有数字除以该比率:
var numbers = [3, 8, 45, 74, 123],
ratio = Math.max.apply(Math, numbers) / 100,
l = numbers.length,
i;
for (i = 0; i < l; i++) {
numbers[i] = Math.round(numbers[i] / ratio);
}
这是小提琴:http://jsfiddle.net/XpRR8/
注意:我正在使用Math.round
将数字四舍五入到最接近的整数。如果您更喜欢将它们保留为浮点数,只需删除函数调用:
for ( i = 0; i < l; i++ ) {
numbers[i] /= ratio;
}
这是小提琴:http://jsfiddle.net/XpRR8/1/
如果您不必支持IE8及以下版本,则可以使用Array.prototype.map()
:
var numbers = [3, 8, 45, 74, 123],
ratio = Math.max.apply(Math, numbers) / 100;
numbers = numbers.map(function (v) {
return Math.round(v / ratio);
});
这是小提琴:http://jsfiddle.net/XpRR8/2/
如果你做支持IE8,但无论如何使用jQuery,你可以使用$.map()
代替:
numbers = $.map(numbers, function (v) {
return Math.round(v / ratio);
});
这是小提琴:http://jsfiddle.net/XpRR8/3/
更新:正如@wvxvw在下面的评论中指出的那样,如果您担心边缘实现会对apply
将要处理的参数数量施加一个人为限制,那么使用循环而不是Math.max.apply
。这是一个示例(假设Array.prototype.map
和$.map
都不可用):
var numbers = [3, 8, 45, 74, 123],
ratio = 0,
i = numbers.length;
while (i--) numbers[i] > ratio && (ratio = numbers[i]);
ratio /= 100;
i = numbers.length;
while (i--) numbers[i] = Math.round(numbers[i] / ratio);
这是小提琴:http://jsfiddle.net/XpRR8/4/
如果你正在使用ES6,那就变得可笑了:
var numbers = [3, 8, 45, 74, 123];
var ratio = Math.max(...numbers) / 100;
numbers = numbers.map(v => Math.round(v / ratio));
答案 1 :(得分:4)
喜欢这个
function Normalize(array, value)
{
for( var i = 0, len = array.length; i < len; i++ )
{
if( parseInt(array[i]) > value) array[i] = value;
}
}
然后使用它:
var arr = [];
arr.push(101);
arr.push(5);
arr.push(6);
Normalize(arr,100);
答案 2 :(得分:0)
嗯,您可以使用Math.max.apply(arr)
获取最大值,然后循环播放或使用arr.map
将所有数字乘以100/max
。完成。
答案 3 :(得分:0)
您需要找到最大值并将所有数字缩放到目标范围。
答案 4 :(得分:0)
function normalize(arr, max) {
// find the max value
var m = 0;
for(var x=0; x<arr.length; x++) m = Math.max(m, arr[x]);
// find the ratio
var r = max / m;
// normalize the array
for(var x=0; x<arr.length; x++) arr[x] = arr[x] * r;
return arr;
}
答案 5 :(得分:0)
只需编辑LastCoder代码以支持负数
function normalize(arr, max) {
// find the max value
var max = arr[0];
var min = arr[0];
for(var x=0; x<arr.length; x++)
max = Math.max(m, arr[x];
for(var x=0; x<arr.length; x++)
min = Math.min(m, arr[x];
// normalize the array
for(var x=0; x<arr.length; x++)
arr[x] = (arr[x] - min) / (max - min);
return arr;
}
答案 6 :(得分:0)
将数组传递到以下函数:
function normalize_array(arr) {
normalize = function(val, max, min) {
return(val - min) / (max - min);
}
max = Math.max.apply(null, arr)
min = Math.min.apply(null, arr)
hold_normed_values=[]
arr.forEach(function(this_num) {
hold_normed_values.push(normalize(this_num, max, min))
})
return(hold_normed_values)
}
示例:
nums = [10, 20, 30, 40, 50]
用法:
normalize_array(mums)