2016-11-04 64 views
2

我想排序包含空字符串,數字,「無限」,「-infinity」和「NaN」的數組。我以字符串的形式接收所有值,因此在空字符串,inf和nan時排序不能按預期工作。有沒有一種方法來按升序和降序來自定義我的排序函數?你如何排序與空字符串,NaN,數字和無窮大的數組

+1

什麼是預期的結果?匿名函數沒有'.name';函數如何被調用?爲什麼'String''「inf」'被認爲是'Infinity'或'String''' Nan'''NaN'? – guest271314

+0

爲什麼不擴展你當前的邏輯並根據字符串的值爲'result'賦值? – 2016-11-04 18:39:23

+0

爲什麼不使用像[Infinity]這樣的真實全局變量(https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Infinity),[NaN](https://developer.mozilla.org/) fr/docs/Web/JavaScript/Reference/Objets_globaux/NaN)而不是使用字符串? – soywod

回答

0

編輯:根據您的評論,"" < "-inf" < "Nan" < "inf" < ... < -1 < 0 < 1 < ...。您可以通過修改order陣列來更改此設置。

注意如果數組包含order陣列中不存在的元素,則此代碼將無法正常工作。您可以爲此設置警戒,或將其他特殊元素(如0)添加到order陣列。

另請注意NaNInfinity(不是字符串文字)也是javascript中的一個數字。使用此代碼,它們將在數字旁邊訂購。

var basicCompare = function (a, b) { 
    if (a > b) return 1; 
    if (a < b) return -1; 
    return 0; 
} 

var compare = function (a, b) { 
    // 0 represents numbers. 
    var order = ["", "-inf", "Nan", "inf", 0], 
     orderOfNumber = order.indexOf(0), 
     orderOfA = typeof(a) === "number" ? orderOfNumber : order.indexOf(a), 
     orderOfB = typeof(b) === "number" ? orderOfNumber : order.indexOf(b); 

    if (orderOfA === orderOfNumber & orderOfB === orderOfNumber) { 
     // They are both numbers, use regular comparison. 
     return basicCompare(a, b); 
    } 

    // They are not both numbers, so use the axiomatic order. 
    return basicCompare(orderOfA, orderOfB) 
} 

array.sort(compare); 
+0

想按字符串比較進行排序。我不想解析這個值。所以我的數組包含字符串和有效數字。我試圖達到的順序是arr = [「」,「-inf」,「Nan」,「inf」,-2,0,2,3]。 – nikitha

+0

我引用了這個公理來使用這個順序。請閱讀代碼並隨時向我提問。我認爲這是你的意思。 – GMunguia

+0

這是否總是將「」,inf,nan作爲字符串進行排序,然後按照相應的順序對它們進行分組? – nikitha

1

您可以使用對象作爲排序順序並將給定的項目移動到想要的位置。

var array = ["", 2, 3, 0, "inf", "-inf", "Nan", -1, -100000]; 
 

 
array.sort(function (a, b) { 
 
    var order = { "": -4, "-inf": -3, "Nan": -2, "inf": -1 }; 
 
    return (order[a] || 0) - (order[b] || 0) || a - b; 
 
}); 
 

 
console.log(array);
.as-console-wrapper { max-height: 100% !important; top: 0; }

+0

你喜歡我的版本?感謝您的CSS :)? –

+0

不,數字按0分組,然後按實際增量分組,請參閱編輯'-100000'。 –

+0

@NinaScholz啊,我明白了。你知道是否有時候從比較函數返回'NaN'而不是'0',就像你的'a'和'b'都是'inf'一樣? – Paulpro