2013-08-02 59 views
1

我有一些數據,我嘗試使用Angular的orderBy過濾器在表格中排序。這是我試圖分類的數據。在特殊情況下使用Angularjs OrderBy排序

[ 
    { 
    "name":"John Doe", 
    "room":"1M-103", 
    }, 
    { 
    "name":"Joe Schmoe", 
    "room":"12M-353", 
    }, 
    { 
    "name":"Bob Guy", 
    "room":"13M-546", 
    }, 
    { 
    "name":"Another Person", 
    "room":"12M-403", 
    }, 
    { 
    "name":"Fred No-name", 
    "room":"3M-204", 
    }, 
[ 

所以按名稱排序工作得很好。然而,按房間排序是另一個問題。我以完全相同的方式對它進行排序。這是我會喜歡看起來像排序後:

1M-103 
3M-204 
12M-353 
12M-403 
13M-546 

它是如何實際上照顧的排序是這樣的:

12M-353 
12M-403 
13M-546 
1M-103 
3M-204 

任何人能幫助我們嗎?我知道爲什麼它的排序是這樣的,因爲它是按位數進行排序並正確排序的,但有沒有某種方法可以讓某些人發現可以稍微更好地排序?

回答

3

您可以創建一個自定義分揀機來做到這一點。

<li ng-repeat="item in items | orderBy:mySorter">{{item}}</li> 

$scope.mySorter = function (item) { 
    return Number(item.room.split('-')[0].replace('M', '')); 
} 

我也爲你創建了一個演示。

更新

您還可以使用正則表達式:

$scope.mySorter = function (item) { 
    return Number(item.room.replace(/[^\d]/g, '')); 
} 

Demo

+0

如果感覺有風險,'return parseInt(item.room,10);'也可以;) –

2

其實SZA的回答完全不是那麼回事,因爲它只考慮到字母「M」前的數字。因此,以12M開頭的所有內容都將被視爲「12」,並被視爲相等。所有12M將在11M之後和13M之前出現,但隨後將以隨機順序顯示在其他12M之間。

我從事了這個代碼:

<li ng-repeat="item in items | orderBy:mySorter">{{item}}</li> 

$scope.mySorter = function (item) { 
    return Number(item.residenceRoom.replace('M', '.').replace('-', '')); 
} 

它創建一個基於號碼前M個點的M.所以12M-353後的數字會是'12 0.353' 和12M-403將一個十進制數是'12.403',所以他們將被正確排序。

我看到的唯一問題是如果房間號碼不總是3位數字。例如,假想房間1M-2將被分類爲「1.2」,而房間1M-103將爲「1.103」,因此房間2將在103房間後分揀。但是,您可以通過將所有房間格式化爲3數字,例如。 1M-002室。