9

我有一个充满正 int 值的数组,我怎样才能规范化这个列表,使最大值始终为 100?先感谢您!

4

7 回答 7

29

这个想法是首先找到数组中的最高数字(使用applyon 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));
于 2012-11-13T20:19:39.017 回答
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);
于 2012-11-13T20:18:53.387 回答
1
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;
}
于 2012-11-13T20:20:07.910 回答
1

将您的数组传递给以下函数

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)

在此处输入图像描述

于 2018-11-11T23:04:53.840 回答
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;
}
于 2012-11-13T20:23:10.963 回答
0

好吧,您可以使用 获得最大值Math.max.apply(arr),然后循环或使用arr.map将所有数字乘以100/max。完毕。

于 2012-11-13T20:18:46.403 回答
0

您需要找到最大值并将所有数字缩放到目标范围。

于 2012-11-13T20:18:55.387 回答