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数値を最も近い整数に丸めるために使用しています。代わりにそれらを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));
于 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

さて、あなたはで最大値を得ることができますMath.max.apply(arr)、そしてループスルーするか、またはarr.mapすべての数に。を掛けるために使用し100/maxます。終わり。

于 2012-11-13T20:18:46.403 に答える
0

最大値を見つけて、すべての数値をターゲット範囲にスケーリングする必要があります。

于 2012-11-13T20:18:55.387 に答える
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 に答える