JavaScriptでnullなどが入った配列をソートする

JavaScriptで配列をソートするとき、nullなどが入っていると、うまくソートされないことがあります。

そこで、ソートするための関数を作りました。

var compare = (a, b, desc = true) => {
    if (a !== a && b !== b) return 0;
    if (a !== a) return 1;
    if (b !== b) return -1; 
    
    if (a == null && b == null) return 0;
    if (a == null) return 1;
    if (b == null) return -1;
    
    if (a === '' && b === '') return 0;
    if (a === '') return 1;
    if (b === '') return -1;
    
    var sig = desc ? 1 : -1;
    return a < b ? sig : (a > b ? -sig : 0);
}

用途としては、テーブルをカラムごとにソートするような場合を想定しているので、降順であろうと、昇順であろうと、NaN, null, undefined, 空文字は後に持ってくるようにしています。

これを使って、

arr.sort((a, b) => compare(a, b)); // 降順
arr.sort((a, b) => compare(a, b, false)); // 昇順

のようにします。