average()
2つの値の平均を計算する方法があります。平均は、10進値の「髪の毛」によって外れています。
const measurements = [
{ timestamp: '2015-09-01T16:00:00.000Z',
temperature: 27.1,
dewPoint: 16.9
},
{ timestamp: '2015-09-01T16:10:00.000Z',
temperature: 27.3,
dewPoint: 0
},
{ timestamp: '2015-09-01T16:20:00.000Z',
temperature: 27.5,
dewPoint: 17.1
},
{ timestamp: '2015-09-01T16:30:00.000Z',
temperature: 27.4,
dewPoint: 17.3
},
{ timestamp: '2015-09-01T16:40:00.000Z',
temperature: 27.2,
dewPoint: 0
},
{ timestamp: '2015-09-01T17:00:00.000Z',
temperature: 28.1,
dewPoint: 18.3
}
]
簡潔にするために、ここでは60行のコードを共有しません。
仮定:
query()
特定のタイムスタンプとの間の範囲を取得するメソッドがあります。私の例では 2015-09-01T16:00:00.000Z
から 2015-09-01T17:00:00.000Z
別の方法は、オブジェクトをループして出力最小と最大指定値とメトリック。私のメトリックは、露点最小と最大上記配列の値は16.9と18.3それぞれ。
最後の間の平均取得する方法(下記参照)を最小と最大値を
したがって、これは上記の説明の結果です。
// POSTMAN result
[
{
"metric": "dewPoint",
"stat": "min",
"value": 16.9
},
{
"metric": "dewPoint",
"stat": "max",
"value": 18.3
},
{
"metric": "dewPoint",
"stat": "average",
"value": 17.4
}
]
最大値と最小値の平均を取得したい。つまり、16.9
&18.3
は17.6であるはずですが、代わりに17.4を取得しています
これが実際のバグがある1つの方法です。
function averageMetric(measurements, metric) {
// => metric dewPoint
// => measurements = the data array in example
let value = 0
let measurementsWithMetric = 0
measurements.forEach(measurement => {
if (measurement[metric]) {
value += measurement[metric]
measurementsWithMetric++
}
})
//=> value = 69.6
//=> measurementsWithMetric = 4
const average = value / measurementsWithMetric // Is this the issue?
// average = 17.4
return isNaN(average) ? null : Math.round(average * 100) / 100
}
ここで問題を理解するのを手伝ってくれませんか?また、上記の方法のES6と同等の解決策を提案できますか?
関数は、ミッドレンジではなく、算術平均を計算します。これを計算する関数は次のとおりです。
const measurements = [
{temperature: 27.1, dewPoint: 16.9},
{temperature: 27.3, dewPoint: 0}, // Isn't this the minimum value though?
{temperature: 27.5, dewPoint: 17.1},
{temperature: 27.4, dewPoint: 17.3},
{temperature: 27.2, dewPoint: 0},
{temperature: 28.1, dewPoint: 18.3},
{temperature: 28.2}
];
function averageMetric(meas, metr) {
const valid = meas.filter(e => e[metr]);
const min = Math.min(...valid.map(e => e[metr]));
const max = Math.max(...valid.map(e => e[metr]));
return (min + max) / 2;
}
console.log(averageMetric(measurements, 'dewPoint'));
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加