javascript如何排序包含NaN的数组

tec*_*dog 2 javascript arrays sorting nan

我正在尝试对有时具有无穷大或NaN的数组进行排序.当我使用标准的javascript array.sort()它似乎排序,直到它达到NaN然后我得到随机结果.

var array =[.02,.2,-.2,Nan,Infinity,20];
Run Code Online (Sandbox Code Playgroud)

有没有办法对此进行排序,以便最终结果从负到正,并且最后仍然有NaN或无穷大.

-.2,.02,.2,20,NaN,Infinity
Run Code Online (Sandbox Code Playgroud)

Fab*_* N. 10

对于这些情况,您可以捕获NaNInfinity使用 JavaScript 的内置实用程序函数:

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);
Run Code Online (Sandbox Code Playgroud)

  • 它本质上仍然是对数组进行洗牌。此外,`isFinite` 已经检查了 `NaN` (2认同)

Esa*_*ija 9

如果你只想以随机顺序将它们碰到最后:

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]
Run Code Online (Sandbox Code Playgroud)

如果你想在最后对无穷大进行排序:

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]
Run Code Online (Sandbox Code Playgroud)

这里的顺序是-Infinity< Infinity<NaN


tri*_*cot 9

从逻辑上讲,负无穷大应该首先排序,因为它实际上比所有其他数字都小。

因此,我会这样做:

const cmp = (a,b) => a-b || isNaN(a)-isNaN(b);

// Example
const arr = [Infinity, NaN, Infinity, -Infinity, NaN, 1, 0, NaN, -1, -0];
console.log(arr.sort(cmp));
Run Code Online (Sandbox Code Playgroud)

  • 这是最好的现代方法答案,它也解决了我在 Fabian 的答案中遇到的 chrome 问题。 (3认同)