2017-05-08 99 views
4

我見過很多答案和文檔,指出您可以將屬性名稱數組傳遞給Angular的orderBy過濾器以按多個字段排序。但是,我的一個對象屬性是以文本形式存儲的數字(字段可以是「100」,「75」,「50」或「< 25」)。爲了將這些值作爲數字進行排序,我一直在使用:AngularJS按屬性和自定義過濾器排序

<div ng-repeat="item in items | orderBy:sortFunction"> 
    {{item.itemStatus}} - {{item.itemLevel}} 
</div> 

//Function in controller... 
$scope.sortFunction = function(item) { 
    return parseInt(item.itemLevel); 
} 

我想現在要做的是排序第一的item.itemStatus,然後通過item.itemLevel爲數字。有沒有辦法做到這一點,而不首先改變我的數據模型?我可以通過全項循環,並增加新的屬性,那就是itemLevel爲一個數字,然後過濾使用

ng-repeat="item in items | orderBy:['itemStatus','itemLevelAsNumber'] 

,但我想知道是否有更好的方法來做到這一點。我已經嘗試過

ng-repeat="item in items | orderBy:['itemStatus',sortFunction] 

但我認爲使用該場景中的函數期望將屬性名返回爲字符串。

謝謝!

+0

你有沒有檢查http://stackoverflow.com/questions/17037524/orderby-multiple-fields-in-angular –

+0

我沒有一個答案做第二次排序,但我想指出,自定義比較器函數需要兩個參數,因爲函數需要在集合的兩個元素之間進行比較。如果兩個項目相等,則必須返回0;如果第一個值小於第二個值,則返回-1;如果第一個項目大於第二個項目,則返回1。 https://docs.angularjs.org/api/ng/filter/orderBy – jlafay

+0

_但我認爲在該場景中使用函數期望將屬性名稱作爲字符串返回._不,它的工作原理與第一次相同例如[查看文檔](https://docs.angularjs.org/api/ng/filter/orderBy#api-section)so'item in items | orderBy:['itemStatus',sortFunction]'應該沒問題。通過這個[小提琴]證明(http://jsfiddle.net/wr10dLyj/) – George

回答

1

問題與我的sortFunction。我沒有意識到,parseInt只會從混合值中提取數字,如果數字是第一個。

parseInt("25") === 25; //true 
parseInt("25+") === 25; //true 
parseInt("<25") === 25; //false - actually returns NaN 

我的sortFunction更新

return parseInt(item.itemLevel.replace('<','')); 

,並在視圖中的多層次的排序依據是什麼,我認爲這應該是現在:

ng-repeat="item in items | orderBy:['itemStatus',sortFunction] 

感謝您的意見!

+1

我會推薦使用正則表達式替換,就好像你在將來會使用它更強大。很高興你解決了你的問題,並感謝你在這裏發佈答案,而不是隻保留自己! – George

相關問題