Infinity
またはが含まれることがある配列をソートしようとしていますNaN
。標準のJavaScriptを使用すると、 array.sort()
aに達するまでソートされNaN
、その後ランダムな結果が得られるようです。
var array =[.02,.2,-.2,Nan,Infinity,20];
最終結果が負から正になり、最後にNaN
orInfinity
を持つようにこれを並べ替える方法はありますか。
-.2,.02,.2,20,NaN,Infinity
Infinity
またはが含まれることがある配列をソートしようとしていますNaN
。標準のJavaScriptを使用すると、 array.sort()
aに達するまでソートされNaN
、その後ランダムな結果が得られるようです。
var array =[.02,.2,-.2,Nan,Infinity,20];
最終結果が負から正になり、最後にNaN
orInfinity
を持つようにこれを並べ替える方法はありますか。
-.2,.02,.2,20,NaN,Infinity
それらをランダムな順序で最後までバンプしたい場合:
var arr = [-1, 0, 1, 10, NaN, 2, NaN, 0, -1, NaN, 5, Infinity, 0, -Infinity];
arr.sort(function(a,b){
if( !isFinite(a) && !isFinite(b) ) {
return 0;
}
if( !isFinite(a) ) {
return 1;
}
if( !isFinite(b) ) {
return -1;
}
return a-b;
});
//[-1, -1, 0, 0, 0, 1, 2, 5, 10, NaN, NaN, NaN, Infinity, -Infinity]
最後に無限大もソートしたい場合:
var arr = [-1, 0, 1, 10, NaN, 2, NaN, 0, -1, NaN, 5, Infinity, 0, -Infinity];
arr.sort(function(a,b){
if( !isFinite(a) && !isFinite(b) ) {
return ( isNaN(a) && isNaN(b) )
? 1
: a < b
? -1
: a === b
? 0
: 1;
}
if( !isFinite(a) ) {
return 1;
}
if( !isFinite(b) ) {
return -1;
}
return a-b;
});
//[-1, -1, 0, 0, 0, 1, 2, 5, 10, -Infinity, Infinity, NaN, NaN, NaN]
順番はこちら-Infinity
<<Infinity
NaN
これらのケースでは、JavaScript の組み込みユーティリティ関数をキャッチNaN
して使用できます。Infinity
let array = [Infinity, -1, 6, 1, 0, NaN, 0, -1, 2, 5, 10, -Infinity, NaN, Infinity, NaN]
//sort -Infinity, NaN, Infinity to the end in random order
array.sort(function(a,b){
if(isFinite(a-b)) {
return a-b;
} else {
return isFinite(a) ? -1 : 1;
}
});
//[-1,-1,0,0,1,2,5,6,10,NaN,Infinity,Infinity,NaN,-Infinity,NaN]
console.log(array);
//sort -Infinity<0<Infinity<NaN
array.sort(function(a,b){
if(isNaN(a)) {
return 1-isNaN(b);
} else {
return a-b;
}
});
//[-Infinity,-1,-1,0,0,1,2,5,6,10,Infinity,Infinity,NaN,NaN,NaN]
console.log(array);
このようなもの?
var arr = [-1, 0, 1, 10, NaN, 2, NaN, 0, -1, NaN, 5, Infinity, 0];
function sortInf (a, b) {
a = parseFloat(a);
b = parseFloat(b);
if ((!a || a === -Infinity) && a !== 0) {
return 1;
} else if ((!b || b === -Infinity) && b !== 0) {
return -1;
} else return a - b;
}
alert(arr.sort(sortInf));
a simple and fast way without conditional or function overhead:
var r=[1,9,NaN,3,4,5,0,-4, NaN , 4, Infinity, 7, 2];
r.sort(function(a,b,c){return a-b || (a||Infinity)-(b||Infinity) || 0 });
alert(r) // == -4,0,1,2,3,4,4,5,7,9,NaN,NaN,Infinity
EDIT: updated based on feedback to avoid a NaN return.
this executes about 20X faster than the other answers, so it's ideal if you need perf, and sorting is one area where perf often DOES matter...