正のint値で満たされた配列がありますが、このリストを正規化して最大値が常に100になるようにするにはどうすればよいですか?前もって感謝します!
7 に答える
アイデアは、最初に配列内の最大数を見つけ(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/
注:私はMath.round
数値を最も近い整数に丸めるために使用しています。代わりにそれらをfloatとして保持したい場合は、関数呼び出しを削除するだけです。
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));
このような
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);
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;
}
配列を次の関数に渡します。
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)
さて、あなたはで最大値を得ることができますMath.max.apply(arr)
、そしてループスルーするか、またはarr.map
すべての数に。を掛けるために使用し100/max
ます。終わり。
最大値を見つけて、すべての数値をターゲット範囲にスケーリングする必要があります。
負の数もサポートするように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;
}