2014-11-25 42 views
0

是否有一種簡單,優雅的方式來按照慣常的順序排列數組,但將任何缺失值視爲0(或任意任意設置的值)而不是undefined是否有`orderBy`過濾器功能允許它正確處理可選屬性?

例如所以,下面的代碼

<li ng-repeat="item in items | orderBy:['-optionalKey', 'secondaryKey']">{{ item.secondaryKey }}</li> 

與像

$scope.items = [ 
    {secondaryKey: 75, optionalKey: 25}, 
    {secondaryKey: 100}, 
    {secondaryKey: 50, optionalKey: 0}, 
]; 

數據集中會產生這種

<li>75</li> 
<li>50</li> 
<li>100</li> 

,而不是這個

<li>100</li> 
<li>75</li> 
<li>50</li> 

播放用在這裏:http://plnkr.co/edit/G3nQyEzHfUiiovJTD44Y?p=preview

我知道我可以重新實現整個orderBy過濾器,但是這不是很維護或面向未來。我也可以在常規的orderBy過濾器中使用函數作爲謂詞,但是我仍然必須將已經內置的複雜參數重新實現到orderBy(例如,深度嵌套,+/-反轉等)。什麼我真的不知道是如果有一些語法,我不知道,讓我做這樣的事情:

<li ng-repeat="item in items | orderBy:['-optionalKey', 'secondaryKey']:false:0">{{ item.secondaryKey }}</li> 

...其中第三個參數(0)代表我想falsy治療價值/丟失鍵爲。

回答

0

原來,答案是比我想象的簡單,因爲角度的內置$parse方法輕鬆處理深鍵嵌套:

$scope.orderByDefault = function(path, defaultValue){ 
    var getter = $parse(path); 

    return function(item){ 
     return getter(item) || defaultValue; 
    }; 
}; 

<li ng-repeat="item in items | orderBy:[orderByDefault('optionalKey.nestedKey', 0),'-secondaryKey']:true"></li> 

@TODO:處理+/-謂詞前綴,所以我不必扭轉整個數組。

0

我目前這樣做的方法是通過運行在陣列上的過濾器之前,責令其填充使用默認值我希望他們有,像這樣的任何可選字段:

.filter('orderByDefault', function(){ 
    return function(array, key, defaultValue){ 
    return array.map(function(item){ 
     if(! item[key]) item[key] = defaultValue; 

     return item; 
    }); 
    }; 
}) 

<li ng-repeat="item in items | orderByDefault:'optionalKey':0 | orderBy:['-optionalKey', 'secondaryKey']">{{ item.secondaryKey }}</li> 

在這裏看到一個例子:http://plnkr.co/edit/W9OwBpd7V7syJXkzxnsV?p=preview

我很擔心這是不是高性能的,因爲它可能是因爲我迭代/ COPYIN g陣列不斷。它還修改了原始數組的內容,這可能會導致副作用,並不一定是需要的。更重要的是,它仍然不能處理深度嵌套,這是我絕對需要支持的。

+0

深鍵嵌套版本:http://plnkr.co/edit/xE03dyAWLMr7oqjIs3rw?p=preview – 2014-11-26 17:17:07

相關問題