如何规范化JavaScript中的正数列表?

Saa*_*ana 8 javascript arrays normalize

我有一个充满正int值的数组,我怎么能规范化这个列表所以最大值总是100?先感谢您!

Jos*_*ber 25

我们的想法是首先找到数组中的最大数字(使用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);
}
Run Code Online (Sandbox Code Playgroud)

这是小提琴:http://jsfiddle.net/XpRR8/


注意:Math.round用来将数字四舍五入到最接近的整数.如果您更喜欢将它们保留为浮点数,只需删除函数调用:

for ( i = 0; i < l; i++ ) {
    numbers[i] /= ratio;
}
Run Code Online (Sandbox Code Playgroud)

这是小提琴: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);
});
Run Code Online (Sandbox Code Playgroud)

这是小提琴:http://jsfiddle.net/XpRR8/2/


如果您确实支持IE8,但无论如何都使用jQuery,您可以使用$.map():

numbers = $.map(numbers, function (v) {
    return Math.round(v / ratio);
});
Run Code Online (Sandbox Code Playgroud)

这是小提琴: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);
Run Code Online (Sandbox Code Playgroud)

这是小提琴: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));
Run Code Online (Sandbox Code Playgroud)