根据100 max计算数组

时间:2012-03-03 16:39:31

标签: javascript arrays

假设我有一个像这样的JS数组......

var newArray = [20,182,757,85,433,209,57,828,635];

我想用这些数据创建条形图,其中最高条的高度== 100。 因此,需要将828值栏设置为100,其余栏需要相对于此计算,也需要计算到最接近的整数。我不知道该如何解决这个问题?

有没有办法使用循环从上面创建一个新数组?那我可以使用新阵列吗?

3 个答案:

答案 0 :(得分:5)

首先,计算最大值:

var max = Math.max.apply(Math, newArray.map(Math.abs));
// will do `Math.max(300, 20, 182, ...)`
// if `newArray` is `[-300, 20, 182]`

然后,将每个元素除以该值,将其乘以100,然后将其向下舍入,使最高值变为100:

var normalized = newArray.map(function(v) {
  return Math.round(v / max * 100);
});

.map本质上是一个循环,但循环在内部完成,因此您可以编写更清晰的代码。请注意它是ES5,因此您需要旧版浏览器的垫片。

答案 1 :(得分:1)

var max = newArray[0];

//determine max value
for (var i in newArray)
    if (newArray[i] > max) max = newArray[i];

//count coficients for every bar
var coefficients = [];
for (var i in newArray) 
    coefficients[i] = Math.round(newArray[i] / max * 100);

答案 2 :(得分:1)

我喜欢pimvdb的解决方案,它没有使用可见的循环,但是因为你问过循环,这里是循环导向的方法:

var newArray = [20,182,757,85,433,209,57,828,635];
var max = newArray[0];
var scaledArray = [];

// find max value
for (var i = 1; i < newArray.length; i++) {
    if (newArray[i] > max) {
        max = newArray[i];
    }
}

// create new scaled array (integer values from 0 to 100)
for (i = 0; i < newArray.length; i++) {
    scaledArray.push(Math.round(newArray[i] * 100 / max));
}

工作示例:http://jsfiddle.net/jfriend00/ExWn8/