Math.max
JavaScriptのor関数に値を渡すMath.min
と、入力からそれぞれ最高値と最低値が返されます。
ただし、未定義のデータが入力された場合、たとえば
Math.max(5,10,undefined);
返される結果はですNaN
。JS / jQueryを使用してこれを修正する簡単な方法はありますか?
Math.max
JavaScriptのor関数に値を渡すMath.min
と、入力からそれぞれ最高値と最低値が返されます。
ただし、未定義のデータが入力された場合、たとえば
Math.max(5,10,undefined);
返される結果はですNaN
。JS / jQueryを使用してこれを修正する簡単な方法はありますか?
undefined
は実際にはいくつかの変数だと思います。
数値を確保するために、-Infinity
任意の値に置き換えることができます。NaN
var foo;
Math.max(5, 10, isNaN(foo) ? -Infinity : foo); // returns 10
同じ概念をで使用できますMath.min
が、Infinity
:
var foo;
Math.min(5, 10, isNaN(foo) ? Infinity : foo); // returns 5
独自のmax
関数を作成します。
function max() {
var par = []
for (var i = 0; i < arguments.length; i++) {
if (!isNaN(arguments[i])) {
par.push(arguments[i]);
}
}
return Math.max.apply(Math, par);
}
または、配列フィルタリングを使用して短くします。
function max() {
var args = Array.prototype.slice.call(arguments);
return Math.max.apply(Math, args.filter(function(val) {
return !isNaN(val);
}));
}
使用法:
max(5, 10, undefined); // output: 10
それは次のように簡単です:
// ES6 (returns: 10)
Math.max(...[5, 10, undefined].filter(Number.isFinite))
または:
// ES5 (returns: 10)
Math.max.apply(null, [5, 10, undefined].filter(Number.isFinite))
読みやすく、目的を伝えるだけだと思います。
説明:を利用して、未定義の値をフィルターで除外し、ES6のspread演算子またはES5のメソッドを使用して、引数として関数に渡します。Number
primitive wrapper object
Math.max
Function.prototype.apply()
に渡す前に、各番号が定義されていることを確認してくださいmax
。デフォルトとして番兵の値を使用します(など-Infinity
)。分のためにあなたは使用したいと思うでしょうInfinity
:
var a = 5;
var b = 10;
var c = undefined;
var defaultForMax = function (num) {
return typeof num === 'number' ? num : -Infinity;
};
c = defaultForMax(c); // c is now -Infinity
Math.max(a, b, c); // 10
私の意見ではさらに簡単ですが、d3を使用してもかまわない場合は、次のようにすることができます。
d3.max([5,10,undefined]) // 10
d3ドキュメント(https://github.com/d3/d3-array#statistics)から:
自然な順序を使用して、指定されたiterableの最小値を返します。
..。
組み込みのMath.minとは異なり、このメソッドは未定義のnull値とNaN値を無視します。これは、欠落しているデータを無視するのに役立ちます。さらに、要素は、数値順ではなく自然順を使用して比較されます。たとえば、文字列[“ 20”、“ 3”]の最小値は“ 20”ですが、数字[20、3]の最小値は3です。
Math.max内で偽物を使用する
var foo;
Math.max(5, 10, !isNaN(foo) && foo);
var foo;
Math.min(5, 10, !isNaN(foo) && foo);
// Returns largest numeric value; excludes NaN's.
function getMax(...args) {
return Math.max(...args.filter(Number.isFinite));
}