2014-02-10 101 views
58

我一直在試圖找出一個很奇怪的問題,我遇到了打字稿。它將內聯布爾表達式視爲第一個值的類型,而不是完整的表達式。TypeScript對一個數組進行排序

所以,如果你嘗試一些簡單的像下面這樣:

var numericArray:Array<number> = [2,3,4,1,5,8,11]; 

var sorrtedArray:Array<number> = numericArray.sort((n1,n2)=> n1 > n2); 

TryIt

你會得到你的排序方法說的參數不匹配,通話對象的任何簽名的錯誤,因爲你的結果是數字而不是布爾值。我想我錯過了一些東西,因爲我很確定n1> n2是一個布爾語句。

回答

75

錯誤是完全正確的。

,因爲它是想告訴你,.sort()需要返回數量,而不是布爾函數。

您需要返回負,如果第一項是小的;如果它更大,則爲正;如果相等,則爲零。

+0

哇我完全錯過了閱讀錯誤信息謝謝! –

+21

這就是爲什麼我們使用TypeScript! :-) –

107

當排序號碼,您可以使用小型的比較:

var numericArray: number[] = [2, 3, 4, 1, 5, 8, 11]; 

var sortedArray: number[] = numericArray.sort((n1,n2) => n1 - n2); 

-而非<

如果你是比較別的,你需要比較轉換成一個數字。

var stringArray: string[] = ['AB', 'Z', 'A', 'AC']; 

var sortedArray: string[] = stringArray.sort((n1,n2) => { 
    if (n1 > n2) { 
     return 1; 
    } 

    if (n1 < n2) { 
     return -1; 
    } 

    return 0; 
}); 
+0

有人可以解釋爲什麼對於低於測試,'[email protected]'爲低於'[email protected]'返回true?例如let myTest =('[email protected]'<'[email protected]'); //對我來說是真的...... :( – user2748659

+1

沒關係:)。剛看了一下ascii圖表。 – user2748659

10

很好的回答Sohnee。 想補充的是,如果你有一個對象數組,然後你想按鍵排序,那麼它幾乎相同,這是一個可以按日期(數字)或標題(字符串)排序的示例:

if (sortBy === 'date') { 
     return n1.date - n2.date 
    } else { 
     if (n1.title > n2.title) { 
      return 1; 
     } 
     if (n1.title < n2.title) { 
      return -1; 
     } 
     return 0; 
    } 

也可以使值作爲變量N1 [現場] VS N2 [現場]裏面如果更有活力,只要保持字符串和數字之間的差異。

+0

評論答案應使用評論功能完成。 – Nicktar

+4

@Nicktar它可能發佈爲格式化的答案。但它不會造成任何傷害 –

1
var numericArray: number[] = [2, 3, 4, 1, 5, 8, 11]; 

var sortFn = (n1 , n2) => number { return n1 - n2; } 

var sortedArray: number[] = numericArray.sort(sortFn); 
+1

您可以在代碼中添加一些信息嗎? – aloisdg

相關問題