2014-09-10 132 views
0

我有一個表視圖中的對象列表,我想正確排序。AngularJS - 對字符串進行排序 - 重複其中的數字

除其他事項外,我的對象包含名稱字段。此名稱字段也可以包含數字,因此,例如: Chairman Seat 1 Seat 2 Seat 3 Seat 11 Seat 12 Seat 23 Secretary

但是,這是排序是這樣的: Chairman Seat 1 Seat 11 Seat 12 Seat 2 Seat 23 Seat 3 Secretary

這似乎並不像按名稱排序時排序我的名單自然的方式。

現在,我使用的NG-重複這樣的: seat in seats | orderBy:orderField:orderReverse track by seat.id 哪裏orderfield一些變量是點擊表頭時設置和orderReverse太扭轉。

我試圖使自定義過濾器,以確保其行爲正常,但我失敗了。看起來,Javascript只是不會正常排序,除非我打破了字符串。但我寧願不是因爲數據經常通過輪詢更新。另一種方法是強制引導零,但因爲用戶手動輸入這些東西,我不知道我是否應該。

而且,它與一些數字不僅名字,所以我不能只是完全切斷他們

那麼,如何使這個名單顯示通常有什麼建議?

編輯:清理有關該問題的一些信息。

+0

你應該寫自己的排序功能。 – dfsq 2014-09-10 13:35:52

+0

搜索「自然排序」。 – Blackhole 2014-09-10 13:42:33

+0

@dfsq我可以做到這一點,但我怎麼會知道與數字和沒有區別。我將如何給他們正確的順序? – Martinspire 2014-09-10 14:23:18

回答

4

您可以使用自定義排序函數orderBy(可能需要自定義的排序功能太)

在你的控制器定義排序功能:

$scope.sorter = function (a){ 
    return parseInt(a.replace(/^\D+/g, '')); // gets number from a string 
} 

,然後在模板

seat in seats | orderBy:sorter track by seat.id 

編輯按照修改後的問題陳述:

做手工分揀的控制器,而不是與NG-repeart使用naturalSort

$scope.seats = [{"id": "Seat 12"},{"id": "Seat 3"},{"id": "Seat 1"},{"id": "Seat 2"},{"id": "Secretary"}]; 
$scope.seats.sort(function(a,b) { 
    return naturalSort(a.id, b.id); 
}) 

或檢查這個角模塊http://blog.overzealous.com/post/55829457993/natural-sorting-within-angular-js和提琴演示它 - http://jsfiddle.net/wE7H2/3/

+0

我已經清理了一下:它也包含正常的字符串,所以我需要保持它們。 – Martinspire 2014-09-10 14:22:43

+0

然後我會告訴你http://www.overset.com/2008/09/01/javascript-natural-sort-algorithm/ 並建議你在'controller'中手動排序而不是'ng- repeart' – Prasad 2014-09-10 14:50:13

+0

更新了答案!如果後者適合你,你可以刪除舊的答案! – Prasad 2014-09-10 14:58:37

相關問題