这个想法是首先找到数组中的最大数字(使用apply on 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/
Note:我在用着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/
If you do支持IE8,但无论如何使用jQuery,你可以使用$.map()反而:
numbers = $.map(numbers, function (v) {
return Math.round(v / ratio);
});
这是小提琴:http://jsfiddle.net/XpRR8/3/
Update:正如 @wvxvw 在下面的评论中指出的,如果您担心对参数数量施加人为限制的边缘实现apply
将处理,然后使用循环而不是Math.max.apply
。这是一个例子(假设两者都不Array.prototype.map
nor $.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));